New Upstream Release - golang-github-google-go-github

Ready changes

Summary

Merged new upstream version: 52.0.0 (was: 50.1.0).

Resulting package

Built on 2023-06-05T07:30 (took 16m41s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases golang-github-google-go-github-dev

Lintian Result

Diff

diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml
index c035aa6..a494d8f 100644
--- a/.github/workflows/linter.yml
+++ b/.github/workflows/linter.yml
@@ -17,7 +17,7 @@ jobs:
         # since that needs libsodium to run.
         working-directory:
           - ""
-          - example
+          # - example  # Fails with "no go files to analyze"
           - scrape
           - update-urls
     runs-on: ${{ matrix.platform }}
@@ -26,8 +26,8 @@ jobs:
     - uses: actions/checkout@v3
 
     - name: golangci-lint ${{ matrix.working-directory }}
-      uses: golangci/golangci-lint-action@0ad9a0988b3973e851ab0a07adf248ec2e100376 #v3.3.1
+      uses: golangci/golangci-lint-action@v3
       with:
-        version: v1.44.0
+        version: latest
         working-directory: ${{ matrix.working-directory}}
         args: --verbose
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 3a0366d..3c9c97a 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -1,3 +1,7 @@
+concurrency:
+  group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: true
+
 on:
   push:
     branches:
@@ -15,12 +19,9 @@ permissions:
 
 jobs:
   test:
-    permissions:
-      actions: write  # for styfle/cancel-workflow-action to cancel/stop running workflows
-      contents: read  # for actions/checkout to fetch code
     strategy:
       matrix:
-        go-version: [1.x, 1.18.x]
+        go-version: [1.x, 1.19.x]
         platform: [ubuntu-latest]
         include:
           # include windows, but only with the latest Go version, since there
@@ -35,12 +36,7 @@ jobs:
     runs-on: ${{ matrix.platform }}
 
     steps:
-    - name: Cancel previous
-      uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 #0.11.0
-      with:
-        access_token: ${{ github.token }}
-
-    - uses: actions/setup-go@v3
+    - uses: actions/setup-go@v4
       with:
         go-version: ${{ matrix.go-version }}
     - uses: actions/checkout@v3
@@ -79,7 +75,7 @@ jobs:
 
     - name: Upload coverage to Codecov
       if: ${{ matrix.update-coverage }}
-      uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 #v3.1.1
+      uses: codecov/codecov-action@40a12dcee2df644d47232dde008099a3e9e4f865 #v3.1.2
 
     - name: Ensure go generate produces a zero diff for update-urls
       shell: bash
diff --git a/.golangci.yml b/.golangci.yml
index db9a4d7..4d3fc17 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -21,7 +21,9 @@ linters:
     - staticcheck
     - ineffassign
     - unused
-issues: 
+issues:
+  exclude:
+    - composites
   exclude-rules:
   - linters:
     - dogsled
diff --git a/AUTHORS b/AUTHORS
index 47e85bd..5e40cd1 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -152,6 +152,7 @@ Florian Wagner <h2floh@github.com>
 Francesc Gil <xescugil@gmail.com>
 Francis <hello@francismakes.com>
 Francisco Guimarães <francisco.cpg@gmail.com>
+François de Metz <francois@2metz.fr>
 Fredrik Jönsson <fredrik.jonsson@izettle.com>
 Gabriel <samfiragabriel@gmail.com>
 Garrett Squire <garrettsquire@gmail.com>
@@ -261,6 +262,7 @@ Martins Sipenko <martins.sipenko@gmail.com>
 Marwan Sulaiman <marwan.sameer@gmail.com>
 Masayuki Izumi <m@izum.in>
 Mat Geist <matgeist@gmail.com>
+Matija Horvat <horvat2112@gmail.com>
 Matin Rahmanian <itsmatinx@gmail.com>
 Matt <alpmatthew@gmail.com>
 Matt Brender <mjbrender@gmail.com>
@@ -274,6 +276,7 @@ Michael Tiller <michael.tiller@gmail.com>
 Michał Glapa <michal.glapa@gmail.com>
 Michelangelo Morrillo <michelangelo@morrillo.it>
 Miguel Elias dos Santos <migueleliasweb@gmail.com>
+Mike Chen <mchen300@gmail.com>
 Mohammed AlDujaili <avainer11@gmail.com>
 Mukundan Senthil <mukundan314@gmail.com>
 Munia Balayil <munia.247@gmail.com>
@@ -304,6 +307,7 @@ parkhyukjun89 <park.hyukjun89@gmail.com>
 Pat Alwell <pat.alwell@gmail.com>
 Patrick DeVivo <patrick.devivo@gmail.com>
 Patrick Marabeas <patrick@marabeas.io>
+Pavel Dvoinos <pavel.dvoinos@transferwise.com>
 Pavel Shtanko <pavel.shtanko@gmail.com>
 Pete Wagner <thepwagner@github.com>
 Petr Shevtsov <petr.shevtsov@gmail.com>
@@ -359,6 +363,7 @@ Sasha Melentyev <sasha@melentyev.io>
 Sean Wang <sean@decrypted.org>
 Sebastian Mandrean <sebastian.mandrean@gmail.com>
 Sebastian Mæland Pedersen <sem.pedersen@stud.uis.no>
+Sergei Popinevskii <gurza000@gmail.com>
 Sergey Romanov <xxsmotur@gmail.com>
 Sergio Garcia <sergio.garcia@gmail.com>
 Seth Vargo <seth@sethvargo.com>
@@ -399,6 +404,7 @@ tkhandel <tarunkhandelwal.iitr@gmail.com>
 Tobias Gesellchen <tobias@gesellix.de>
 Tom Payne <twpayne@gmail.com>
 Trey Tacon <ttacon@gmail.com>
+tsbkw <tsbkw0@gmail.com>
 ttacon <ttacon@gmail.com>
 Vaibhav Singh <vaibhav.singh.14cse@bml.edu.in>
 Varadarajan Aravamudhan <varadaraajan@gmail.com>
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 25d455b..fb36604 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -44,9 +44,8 @@ are more sensitive, emailed to <opensource@google.com>.
 
   1. Go makes it very simple to ensure properly formatted code, so always run
      `go fmt` on your code before committing it. You should also run
-     [golint][] over your code. As noted in the [golint readme][], it's not
-     strictly necessary that your code be completely "lint-free", but this will
-     help you find common style issues.
+     [go vet][] over your code. this will help you find common style issues
+     within your code and will keep styling consistent within the project.
 
   1. Any significant changes should almost always be accompanied by tests. The
      project already has good test coverage, so look at some of the existing
@@ -59,18 +58,35 @@ are more sensitive, emailed to <opensource@google.com>.
      * `go test github.com/google/go-github/...`
      * `go vet github.com/google/go-github/...`
 
+   The `go generate ./...` command will update or generate certain files, and the 
+   resulting changes should be included in your pull request.
+
+   The `go test ./...` command will run tests inside your code. This will help you
+   spot places where code might be faulty before committing.
+
+   And finally, the `go vet ./...` command will check linting and styling over your 
+   code, keeping the project consistent formatting-wise.
+
+   In any case, it is always a good idea to read [official Go documentation][] when working 
+   on this project, as the definition of tools and commands of the Go programming 
+   language is described in further detail there.
+
   1. Do your best to have [well-formed commit messages][] for each change.
      This provides consistency throughout the project, and ensures that commit
      messages are able to be formatted properly by various git tools.
 
   1. Finally, push the commits to your fork and submit a [pull request][].
+     Before pushing commits, it is highly advised to check for generated files
+     that were either created or modified for the sake of your commit. Running
+     `go generate -x ./...` should return a log of modified generated files that should
+     be included alongside the manually written code in the commit.
      **NOTE:** Please do not use force-push on PRs in this repo, as it makes
      it more difficult for reviewers to see what has changed since the last
      code review.
 
+[official Go documentation]: https://pkg.go.dev/std
 [forking]: https://help.github.com/articles/fork-a-repo
-[golint]: https://github.com/golang/lint
-[golint readme]: https://github.com/golang/lint/blob/master/README.md
+[go vet]: https://pkg.go.dev/cmd/vet
 [gocov]: https://github.com/axw/gocov
 [gocov-html]: https://github.com/matm/gocov-html
 [well-formed commit messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
@@ -128,4 +144,5 @@ this][modified-comment].
 [rebase-comment]: https://github.com/google/go-github/pull/277#issuecomment-183035491
 [modified-comment]: https://github.com/google/go-github/pull/280#issuecomment-184859046
 
-**When creating a release, don't forget to update the `Version` constant in `github.go`.** This is used to send the version in the `User-Agent` header to identify clients to the GitHub API.
+**When creating a release, don't forget to update the `Version` constant in `github.go`.** This is used to 
+send the version in the `User-Agent` header to identify clients to the GitHub API.
diff --git a/README.md b/README.md
index 0f99698..33f33fe 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # go-github #
 
 [![go-github release (latest SemVer)](https://img.shields.io/github/v/release/google/go-github?sort=semver)](https://github.com/google/go-github/releases)
-[![GoDoc](https://img.shields.io/static/v1?label=godoc&message=reference&color=blue)](https://pkg.go.dev/github.com/google/go-github/v48/github)
+[![GoDoc](https://img.shields.io/static/v1?label=godoc&message=reference&color=blue)](https://pkg.go.dev/github.com/google/go-github/v52/github)
 [![Test Status](https://github.com/google/go-github/workflows/tests/badge.svg)](https://github.com/google/go-github/actions?query=workflow%3Atests)
 [![Test Coverage](https://codecov.io/gh/google/go-github/branch/master/graph/badge.svg)](https://codecov.io/gh/google/go-github)
 [![Discuss at go-github@googlegroups.com](https://img.shields.io/badge/discuss-go--github%40googlegroups.com-blue.svg)](https://groups.google.com/group/go-github)
@@ -24,7 +24,7 @@ If you're interested in using the [GraphQL API v4][], the recommended library is
 go-github is compatible with modern Go releases in module mode, with Go installed:
 
 ```bash
-go get github.com/google/go-github/v48
+go get github.com/google/go-github/v52
 ```
 
 will resolve and add the package to the current development module, along with its dependencies.
@@ -32,7 +32,7 @@ will resolve and add the package to the current development module, along with i
 Alternatively the same can be achieved if you use import in a package:
 
 ```go
-import "github.com/google/go-github/v48/github"
+import "github.com/google/go-github/v52/github"
 ```
 
 and run `go get` without parameters.
@@ -40,13 +40,13 @@ and run `go get` without parameters.
 Finally, to use the top-of-trunk version of this repo, use the following command:
 
 ```bash
-go get github.com/google/go-github/v48@master
+go get github.com/google/go-github/v52@master
 ```
 
 ## Usage ##
 
 ```go
-import "github.com/google/go-github/v48/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
+import "github.com/google/go-github/v52/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
 import "github.com/google/go-github/github" // with go modules disabled
 ```
 
@@ -135,7 +135,7 @@ import (
 	"net/http"
 
 	"github.com/bradleyfalzon/ghinstallation/v2"
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 )
 
 func main() {
@@ -186,6 +186,24 @@ if _, ok := err.(*github.RateLimitError); ok {
 Learn more about GitHub rate limiting at
 https://docs.github.com/en/rest/rate-limit .
 
+In addition to these rate limits, GitHub imposes a secondary rate limit on all API clients.
+This rate limit prevents clients from making too many concurrent requests.
+
+To detect an API secondary rate limit error, you can check if its type is `*github.AbuseRateLimitError`:
+
+```go
+repos, _, err := client.Repositories.List(ctx, "", nil)
+if _, ok := err.(*github.AbuseRateLimitError); ok {
+	log.Println("hit secondary rate limit")
+}
+```
+
+You can use [go-github-ratelimit](https://github.com/gofri/go-github-ratelimit) to handle
+secondary rate limit sleep-and-retry for you.
+
+Learn more about GitHub secondary rate limiting at
+https://docs.github.com/en/rest/overview/resources-in-the-rest-api#secondary-rate-limits .
+
 ### Accepted Status ###
 
 Some endpoints may return a 202 Accepted status code, meaning that the
@@ -209,7 +227,22 @@ The GitHub API has good support for conditional requests which will help
 prevent you from burning through your rate limit, as well as help speed up your
 application. `go-github` does not handle conditional requests directly, but is
 instead designed to work with a caching `http.Transport`. We recommend using
-https://github.com/gregjones/httpcache for that.
+https://github.com/gregjones/httpcache for that. For example:
+
+```go
+import "github.com/gregjones/httpcache"
+
+	ts := oauth2.StaticTokenSource(
+		&oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")},
+	)
+	tc := &http.Client{
+		Transport: &oauth2.Transport{
+			Base:   httpcache.NewMemoryCacheTransport(),
+			Source: ts,
+		},
+	}
+	client := github.NewClient(tc)
+```
 
 Learn more about GitHub conditional requests at
 https://docs.github.com/en/rest/overview/resources-in-the-rest-api#conditional-requests.
@@ -290,7 +323,7 @@ For complete usage of go-github, see the full [package docs][].
 [oauth2]: https://github.com/golang/oauth2
 [oauth2 docs]: https://godoc.org/golang.org/x/oauth2
 [personal API token]: https://github.com/blog/1509-personal-api-tokens
-[package docs]: https://pkg.go.dev/github.com/google/go-github/v48/github
+[package docs]: https://pkg.go.dev/github.com/google/go-github/v52/github
 [GraphQL API v4]: https://developer.github.com/v4/
 [shurcooL/githubv4]: https://github.com/shurcooL/githubv4
 [GitHub webhook events]: https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads
@@ -332,6 +365,46 @@ Preview functionality may take the form of entire methods or simply additional
 data returned from an otherwise non-preview method. Refer to the GitHub API
 documentation for details on preview functionality.
 
+### Calendar Versioning ###
+
+As of 2022-11-28, GitHub [has announced](https://github.blog/2022-11-28-to-infinity-and-beyond-enabling-the-future-of-githubs-rest-api-with-api-versioning/)
+that they are starting to version their v3 API based on "calendar-versioning".
+
+In practice, our goal is to make per-method version overrides (at
+least in the core library) rare and temporary.
+
+Our understanding of the GitHub docs is that they will be revving the
+entire API to each new date-based version, even if only a few methods
+have breaking changes. Other methods will accept the new version with
+their existing functionality. So when a new date-based version of the
+GitHub API is released, we (the repo maintainers) plan to:
+
+* update each method that had breaking changes, overriding their
+  per-method API version header. This may happen in one or multiple
+  commits and PRs, and is all done in the main branch.
+
+* once all of the methods with breaking changes have been updated,
+  have a final commit that bumps the default API version, and remove
+  all of the per-method overrides. That would now get a major version
+  bump when the next go-github release is made.
+
+### Version Compatibility Table ###
+
+The following table identifies which version of the GitHub API is
+supported by this (and past) versions of this repo (go-github).
+Versions prior to 48.2.0 are not listed.
+
+| go-github Version | GitHub v3 API Version |
+| ----------------- | --------------------- |
+| 52.0.0            | 2022-11-28            |
+| 51.0.0            | 2022-11-28            |
+| 50.2.0            | 2022-11-28            |
+| 50.1.0            | 2022-11-28            |
+| 50.0.0            | 2022-11-28            |
+| 49.1.0            | 2022-11-28            |
+| 49.0.0            | 2022-11-28            |
+| 48.2.0            | 2022-11-28            |
+
 ## License ##
 
 This library is distributed under the BSD-style license found in the [LICENSE](./LICENSE)
diff --git a/debian/changelog b/debian/changelog
index 4ba840c..80ab3ed 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+golang-github-google-go-github (52.0.0-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+  * Drop patch 0001-Remove-failing-unit-tests-for-Go-1.20-2656.patch, present
+    upstream.
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Mon, 05 Jun 2023 07:14:27 -0000
+
 golang-github-google-go-github (48.1.0-2) unstable; urgency=medium
 
   * Team upload.
diff --git a/debian/patches/0001-Remove-failing-unit-tests-for-Go-1.20-2656.patch b/debian/patches/0001-Remove-failing-unit-tests-for-Go-1.20-2656.patch
deleted file mode 100644
index 8d0180a..0000000
--- a/debian/patches/0001-Remove-failing-unit-tests-for-Go-1.20-2656.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From: Glenn Lewis <6598971+gmlewis@users.noreply.github.com>
-Date: Thu, 2 Feb 2023 06:57:20 -0500
-Subject: Remove failing unit tests for Go 1.20 (#2656)
-
-Fixes: #2654.
-
-Origin: backport, https://github.com/google/go-github/commit/ef6c7a6d
----
- github/actions_artifacts_test.go | 17 -----------------
- github/repos_contents_test.go    | 17 -----------------
- 2 files changed, 34 deletions(-)
-
-diff --git a/github/actions_artifacts_test.go b/github/actions_artifacts_test.go
-index 345a087..e35a873 100644
---- a/github/actions_artifacts_test.go
-+++ b/github/actions_artifacts_test.go
-@@ -368,23 +368,6 @@ func TestActionsService_DownloadArtifact_StatusMovedPermanently_followRedirects(
- 	}
- }
- 
--func TestActionsService_DownloadArtifact_invalidLocationHeader(t *testing.T) {
--	client, mux, _, teardown := setup()
--	defer teardown()
--
--	mux.HandleFunc("/repos/o/r/actions/artifacts/1/zip", func(w http.ResponseWriter, r *http.Request) {
--		testMethod(t, r, "GET")
--		ctlChar := 0x7f
--		badURL := "https://google.com" + string(byte(ctlChar))
--		w.Header().Add("Location", badURL)
--		w.WriteHeader(http.StatusFound)
--	})
--
--	ctx := context.Background()
--	_, _, err := client.Actions.DownloadArtifact(ctx, "o", "r", 1, false)
--	testURLParseError(t, err)
--}
--
- func TestActionsService_DeleteArtifact(t *testing.T) {
- 	client, mux, _, teardown := setup()
- 	defer teardown()
-diff --git a/github/repos_contents_test.go b/github/repos_contents_test.go
-index f5de557..8c16d6e 100644
---- a/github/repos_contents_test.go
-+++ b/github/repos_contents_test.go
-@@ -744,23 +744,6 @@ func TestRepositoriesService_GetArchiveLink_StatusMovedPermanently_followRedirec
- 	}
- }
- 
--func TestRepositoriesService_GetArchiveLink_invalidLocationHeader(t *testing.T) {
--	client, mux, _, teardown := setup()
--	defer teardown()
--
--	mux.HandleFunc("/repos/o/r/tarball", func(w http.ResponseWriter, r *http.Request) {
--		testMethod(t, r, "GET")
--		ctlChar := 0x7f
--		badURL := "https://google.com" + string(byte(ctlChar))
--		w.Header().Add("Location", badURL)
--		w.WriteHeader(http.StatusFound)
--	})
--
--	ctx := context.Background()
--	_, _, err := client.Repositories.GetArchiveLink(ctx, "o", "r", Tarball, &RepositoryContentGetOptions{}, false)
--	testURLParseError(t, err)
--}
--
- func TestRepositoriesService_GetContents_NoTrailingSlashInDirectoryApiPath(t *testing.T) {
- 	client, mux, _, teardown := setup()
- 	defer teardown()
diff --git a/debian/patches/series b/debian/patches/series
index e72c818..e69de29 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +0,0 @@
-0001-Remove-failing-unit-tests-for-Go-1.20-2656.patch
diff --git a/example/actionpermissions/main.go b/example/actionpermissions/main.go
index c568d57..34b7d69 100644
--- a/example/actionpermissions/main.go
+++ b/example/actionpermissions/main.go
@@ -14,8 +14,7 @@ import (
 	"log"
 	"os"
 
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 )
 
 var (
@@ -36,9 +35,7 @@ func main() {
 		log.Fatal("No owner: owner of repo must be given")
 	}
 	ctx := context.Background()
-	ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
-	tc := oauth2.NewClient(ctx, ts)
-	client := github.NewClient(tc)
+	client := github.NewTokenClient(ctx, token)
 
 	actionsPermissionsRepository, _, err := client.Repositories.GetActionsPermissions(ctx, *owner, *name)
 	if err != nil {
diff --git a/example/appengine/app.go b/example/appengine/app.go
index e4ba5d9..e2f2a5f 100644
--- a/example/appengine/app.go
+++ b/example/appengine/app.go
@@ -12,8 +12,7 @@ import (
 	"net/http"
 	"os"
 
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 	"google.golang.org/appengine"
 	"google.golang.org/appengine/log"
 )
@@ -29,11 +28,7 @@ func handler(w http.ResponseWriter, r *http.Request) {
 	}
 
 	ctx := appengine.NewContext(r)
-	ts := oauth2.StaticTokenSource(
-		&oauth2.Token{AccessToken: os.Getenv("GITHUB_AUTH_TOKEN")},
-	)
-	tc := oauth2.NewClient(ctx, ts)
-	client := github.NewClient(tc)
+	client := github.NewTokenClient(ctx, os.Getenv("GITHUB_AUTH_TOKEN"))
 
 	commits, _, err := client.Repositories.ListCommits(ctx, "google", "go-github", nil)
 	if err != nil {
diff --git a/example/basicauth/main.go b/example/basicauth/main.go
index 4360443..c432db8 100644
--- a/example/basicauth/main.go
+++ b/example/basicauth/main.go
@@ -22,7 +22,7 @@ import (
 	"strings"
 	"syscall"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 	"golang.org/x/crypto/ssh/terminal"
 )
 
diff --git a/example/commitpr/main.go b/example/commitpr/main.go
index 1d60625..55fa03f 100644
--- a/example/commitpr/main.go
+++ b/example/commitpr/main.go
@@ -30,8 +30,7 @@ import (
 	"strings"
 	"time"
 
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 )
 
 var (
@@ -133,7 +132,7 @@ func pushCommit(ref *github.Reference, tree *github.Tree) (err error) {
 
 	// Create the commit using the tree.
 	date := time.Now()
-	author := &github.CommitAuthor{Date: &date, Name: authorName, Email: authorEmail}
+	author := &github.CommitAuthor{Date: &github.Timestamp{date}, Name: authorName, Email: authorEmail}
 	commit := &github.Commit{Author: author, Message: commitMessage, Tree: tree, Parents: []*github.Commit{parent.Commit}}
 	newCommit, _, err := client.Git.CreateCommit(ctx, *sourceOwner, *sourceRepo, commit)
 	if err != nil {
@@ -188,9 +187,7 @@ func main() {
 	if *sourceOwner == "" || *sourceRepo == "" || *commitBranch == "" || *sourceFiles == "" || *authorName == "" || *authorEmail == "" {
 		log.Fatal("You need to specify a non-empty value for the flags `-source-owner`, `-source-repo`, `-commit-branch`, `-files`, `-author-name` and `-author-email`")
 	}
-	ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
-	tc := oauth2.NewClient(ctx, ts)
-	client = github.NewClient(tc)
+	client = github.NewTokenClient(ctx, token)
 
 	ref, err := getRef()
 	if err != nil {
diff --git a/example/go.mod b/example/go.mod
index 9d98950..144f51b 100644
--- a/example/go.mod
+++ b/example/go.mod
@@ -1,11 +1,12 @@
-module github.com/google/go-github/v48/example
+module github.com/google/go-github/v52/example
 
 go 1.17
 
 require (
 	github.com/bradleyfalzon/ghinstallation/v2 v2.0.4
-	github.com/google/go-github/v48 v48.0.0
-	golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
+	github.com/gofri/go-github-ratelimit v1.0.1
+	github.com/google/go-github/v52 v52.0.0
+	golang.org/x/crypto v0.1.0
 	golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
 	google.golang.org/appengine v1.6.7
 )
@@ -15,10 +16,10 @@ require (
 	github.com/golang/protobuf v1.3.2 // indirect
 	github.com/google/go-github/v41 v41.0.0 // indirect
 	github.com/google/go-querystring v1.1.0 // indirect
-	golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect
-	golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect
-	golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect
+	golang.org/x/net v0.7.0 // indirect
+	golang.org/x/sys v0.5.0 // indirect
+	golang.org/x/term v0.5.0 // indirect
 )
 
 // Use version at HEAD, not the latest published.
-replace github.com/google/go-github/v48 => ../
+replace github.com/google/go-github/v52 => ../
diff --git a/example/go.sum b/example/go.sum
index a3c96e9..71e7a99 100644
--- a/example/go.sum
+++ b/example/go.sum
@@ -1,5 +1,7 @@
 github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 h1:tXKVfhE7FcSkhkv0UwkLvPDeZ4kz6OXd0PKPlFqf81M=
 github.com/bradleyfalzon/ghinstallation/v2 v2.0.4/go.mod h1:B40qPqJxWE0jDZgOR1JmaMy+4AY1eBP+IByOvqyAKp0=
+github.com/gofri/go-github-ratelimit v1.0.1 h1:sgefSzxhnvwZ+wR9uZ4l9TnjgLuNiwipJVzJL4YLj9A=
+github.com/gofri/go-github-ratelimit v1.0.1/go.mod h1:OnCi5gV+hAG/LMR7llGhU7yHt44se9sYgKPnafoL7RY=
 github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=
 github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -7,30 +9,53 @@ github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
-github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg=
 github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
+golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
+golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
diff --git a/example/listenvironments/main.go b/example/listenvironments/main.go
index ddee688..9324ecf 100644
--- a/example/listenvironments/main.go
+++ b/example/listenvironments/main.go
@@ -18,8 +18,7 @@ import (
 	"log"
 	"os"
 
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 )
 
 func main() {
@@ -31,11 +30,8 @@ func main() {
 		log.Fatal("Unauthorized: No token present")
 	}
 
-	ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
-
 	ctx := context.Background()
-	tc := oauth2.NewClient(ctx, ts)
-	client := github.NewClient(tc)
+	client := github.NewTokenClient(ctx, token)
 
 	expectedPageSize := 2
 
diff --git a/example/migrations/main.go b/example/migrations/main.go
index 096085c..1708a76 100644
--- a/example/migrations/main.go
+++ b/example/migrations/main.go
@@ -12,17 +12,12 @@ import (
 	"context"
 	"fmt"
 
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 )
 
 func fetchAllUserMigrations() ([]*github.UserMigration, error) {
 	ctx := context.Background()
-	ts := oauth2.StaticTokenSource(
-		&oauth2.Token{AccessToken: "<GITHUB_AUTH_TOKEN>"},
-	)
-	tc := oauth2.NewClient(ctx, ts)
-	client := github.NewClient(tc)
+	client := github.NewTokenClient(ctx, "<GITHUB_AUTH_TOKEN>")
 
 	migrations, _, err := client.Migrations.ListUserMigrations(ctx, &github.ListOptions{Page: 1})
 	return migrations, err
diff --git a/example/newfilewithappauth/main.go b/example/newfilewithappauth/main.go
index a448a05..71688ee 100644
--- a/example/newfilewithappauth/main.go
+++ b/example/newfilewithappauth/main.go
@@ -16,7 +16,7 @@ import (
 	"time"
 
 	"github.com/bradleyfalzon/ghinstallation/v2"
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 	"golang.org/x/oauth2"
 )
 
diff --git a/example/newrepo/main.go b/example/newrepo/main.go
index 46378f9..fccf471 100644
--- a/example/newrepo/main.go
+++ b/example/newrepo/main.go
@@ -16,8 +16,7 @@ import (
 	"log"
 	"os"
 
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 )
 
 var (
@@ -37,9 +36,7 @@ func main() {
 		log.Fatal("No name: New repos must be given a name")
 	}
 	ctx := context.Background()
-	ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
-	tc := oauth2.NewClient(ctx, ts)
-	client := github.NewClient(tc)
+	client := github.NewTokenClient(ctx, token)
 
 	r := &github.Repository{Name: name, Private: private, Description: description, AutoInit: autoInit}
 	repo, _, err := client.Repositories.Create(ctx, "", r)
diff --git a/example/newreposecretwithlibsodium/go.mod b/example/newreposecretwithlibsodium/go.mod
index 4519c05..8f3cd79 100644
--- a/example/newreposecretwithlibsodium/go.mod
+++ b/example/newreposecretwithlibsodium/go.mod
@@ -4,9 +4,9 @@ go 1.15
 
 require (
 	github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb
-	github.com/google/go-github/v48 v48.0.0
+	github.com/google/go-github/v52 v52.0.0
 	golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
 )
 
 // Use version at HEAD, not the latest published.
-replace github.com/google/go-github/v48 => ../..
+replace github.com/google/go-github/v52 => ../..
diff --git a/example/newreposecretwithlibsodium/go.sum b/example/newreposecretwithlibsodium/go.sum
index abc7362..dfbf764 100644
--- a/example/newreposecretwithlibsodium/go.sum
+++ b/example/newreposecretwithlibsodium/go.sum
@@ -84,8 +84,8 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
-github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
diff --git a/example/newreposecretwithlibsodium/main.go b/example/newreposecretwithlibsodium/main.go
index fb66df8..238943b 100644
--- a/example/newreposecretwithlibsodium/main.go
+++ b/example/newreposecretwithlibsodium/main.go
@@ -36,8 +36,7 @@ import (
 	"os"
 
 	sodium "github.com/GoKillers/libsodium-go/cryptobox"
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 )
 
 var (
@@ -71,7 +70,8 @@ func main() {
 		log.Fatal(err)
 	}
 
-	ctx, client, err := githubAuth(token)
+	ctx := context.Background()
+	client := github.NewTokenClient(ctx, token)
 	if err != nil {
 		log.Fatalf("unable to authorize using env GITHUB_AUTH_TOKEN: %v", err)
 	}
@@ -99,18 +99,6 @@ func getSecretValue(secretName string) (string, error) {
 	return secretValue, nil
 }
 
-// githubAuth returns a GitHub client and context.
-func githubAuth(token string) (context.Context, *github.Client, error) {
-	ctx := context.Background()
-	ts := oauth2.StaticTokenSource(
-		&oauth2.Token{AccessToken: token},
-	)
-	tc := oauth2.NewClient(ctx, ts)
-
-	client := github.NewClient(tc)
-	return ctx, client, nil
-}
-
 // addRepoSecret will add a secret to a GitHub repo for use in GitHub Actions.
 //
 // Finally, the secretName and secretValue will determine the name of the secret added and it's corresponding value.
diff --git a/example/newreposecretwithxcrypto/main.go b/example/newreposecretwithxcrypto/main.go
index c4f38f3..b55ecc2 100644
--- a/example/newreposecretwithxcrypto/main.go
+++ b/example/newreposecretwithxcrypto/main.go
@@ -36,9 +36,8 @@ import (
 	"log"
 	"os"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 	"golang.org/x/crypto/nacl/box"
-	"golang.org/x/oauth2"
 )
 
 var (
@@ -72,10 +71,8 @@ func main() {
 		log.Fatal(err)
 	}
 
-	ctx, client, err := githubAuth(token)
-	if err != nil {
-		log.Fatalf("unable to authorize using env GITHUB_AUTH_TOKEN: %v", err)
-	}
+	ctx := context.Background()
+	client := github.NewTokenClient(ctx, token)
 
 	if err := addRepoSecret(ctx, client, *owner, *repo, secretName, secretValue); err != nil {
 		log.Fatal(err)
@@ -100,18 +97,6 @@ func getSecretValue(secretName string) (string, error) {
 	return secretValue, nil
 }
 
-// githubAuth returns a GitHub client and context.
-func githubAuth(token string) (context.Context, *github.Client, error) {
-	ctx := context.Background()
-	ts := oauth2.StaticTokenSource(
-		&oauth2.Token{AccessToken: token},
-	)
-	tc := oauth2.NewClient(ctx, ts)
-
-	client := github.NewClient(tc)
-	return ctx, client, nil
-}
-
 // addRepoSecret will add a secret to a GitHub repo for use in GitHub Actions.
 //
 // Finally, the secretName and secretValue will determine the name of the secret added and it's corresponding value.
diff --git a/example/ratelimit/main.go b/example/ratelimit/main.go
new file mode 100644
index 0000000..f874068
--- /dev/null
+++ b/example/ratelimit/main.go
@@ -0,0 +1,42 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// The ratelimit command demonstrates using the github_ratelimit.SecondaryRateLimitWaiter.
+// By using the waiter, the client automatically sleeps and retry requests
+// when it hits secondary rate limits.
+package main
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/gofri/go-github-ratelimit/github_ratelimit"
+	"github.com/google/go-github/v52/github"
+)
+
+func main() {
+	var username string
+	fmt.Print("Enter GitHub username: ")
+	fmt.Scanf("%s", &username)
+
+	rateLimiter, err := github_ratelimit.NewRateLimitWaiterClient(nil)
+	if err != nil {
+		fmt.Printf("Error: %v\n", err)
+		return
+	}
+
+	client := github.NewClient(rateLimiter)
+
+	// arbitrary usage of the client
+	organizations, _, err := client.Organizations.List(context.Background(), username, nil)
+	if err != nil {
+		fmt.Printf("Error: %v\n", err)
+		return
+	}
+
+	for i, organization := range organizations {
+		fmt.Printf("%v. %v\n", i+1, organization.GetLogin())
+	}
+}
diff --git a/example/simple/main.go b/example/simple/main.go
index ed68b4e..438097c 100644
--- a/example/simple/main.go
+++ b/example/simple/main.go
@@ -12,7 +12,7 @@ import (
 	"context"
 	"fmt"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 )
 
 // Fetch all the public organizations' membership of a user.
diff --git a/example/tagprotection/main.go b/example/tagprotection/main.go
index 09ae4dc..c78f34f 100644
--- a/example/tagprotection/main.go
+++ b/example/tagprotection/main.go
@@ -19,9 +19,8 @@ import (
 	"strings"
 	"syscall"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 	"golang.org/x/crypto/ssh/terminal"
-	"golang.org/x/oauth2"
 )
 
 func main() {
@@ -45,12 +44,7 @@ func main() {
 	token := string(byteToken)
 
 	ctx := context.Background()
-	ts := oauth2.StaticTokenSource(
-		&oauth2.Token{AccessToken: token},
-	)
-	tc := oauth2.NewClient(ctx, ts)
-
-	client := github.NewClient(tc)
+	client := github.NewTokenClient(ctx, token)
 
 	// create new tag protection
 	if pattern != "" {
diff --git a/example/tokenauth/main.go b/example/tokenauth/main.go
index c6ef3cd..f0ae2f7 100644
--- a/example/tokenauth/main.go
+++ b/example/tokenauth/main.go
@@ -14,9 +14,8 @@ import (
 	"log"
 	"syscall"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 	"golang.org/x/crypto/ssh/terminal"
-	"golang.org/x/oauth2"
 )
 
 func main() {
@@ -26,12 +25,7 @@ func main() {
 	token := string(byteToken)
 
 	ctx := context.Background()
-	ts := oauth2.StaticTokenSource(
-		&oauth2.Token{AccessToken: token},
-	)
-	tc := oauth2.NewClient(ctx, ts)
-
-	client := github.NewClient(tc)
+	client := github.NewTokenClient(ctx, token)
 
 	user, resp, err := client.Users.Get(ctx, "")
 	if err != nil {
diff --git a/example/topics/main.go b/example/topics/main.go
index 1033c27..cdab7a5 100644
--- a/example/topics/main.go
+++ b/example/topics/main.go
@@ -12,7 +12,7 @@ import (
 	"context"
 	"fmt"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 )
 
 // Fetch and lists all the public topics associated with the specified GitHub topic
diff --git a/github/actions_artifacts.go b/github/actions_artifacts.go
index 99329d9..441a539 100644
--- a/github/actions_artifacts.go
+++ b/github/actions_artifacts.go
@@ -12,20 +12,34 @@ import (
 	"net/url"
 )
 
-// Artifact reprents a GitHub artifact.  Artifacts allow sharing
+// ArtifactWorkflowRun represents a GitHub artifact's workflow run.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts
+type ArtifactWorkflowRun struct {
+	ID               *int64  `json:"id,omitempty"`
+	RepositoryID     *int64  `json:"repository_id,omitempty"`
+	HeadRepositoryID *int64  `json:"head_repository_id,omitempty"`
+	HeadBranch       *string `json:"head_branch,omitempty"`
+	HeadSHA          *string `json:"head_sha,omitempty"`
+}
+
+// Artifact represents a GitHub artifact.  Artifacts allow sharing
 // data between jobs in a workflow and provide storage for data
 // once a workflow is complete.
 //
 // GitHub API docs: https://docs.github.com/en/rest/actions/artifacts
 type Artifact struct {
-	ID                 *int64     `json:"id,omitempty"`
-	NodeID             *string    `json:"node_id,omitempty"`
-	Name               *string    `json:"name,omitempty"`
-	SizeInBytes        *int64     `json:"size_in_bytes,omitempty"`
-	ArchiveDownloadURL *string    `json:"archive_download_url,omitempty"`
-	Expired            *bool      `json:"expired,omitempty"`
-	CreatedAt          *Timestamp `json:"created_at,omitempty"`
-	ExpiresAt          *Timestamp `json:"expires_at,omitempty"`
+	ID                 *int64               `json:"id,omitempty"`
+	NodeID             *string              `json:"node_id,omitempty"`
+	Name               *string              `json:"name,omitempty"`
+	SizeInBytes        *int64               `json:"size_in_bytes,omitempty"`
+	URL                *string              `json:"url,omitempty"`
+	ArchiveDownloadURL *string              `json:"archive_download_url,omitempty"`
+	Expired            *bool                `json:"expired,omitempty"`
+	CreatedAt          *Timestamp           `json:"created_at,omitempty"`
+	UpdatedAt          *Timestamp           `json:"updated_at,omitempty"`
+	ExpiresAt          *Timestamp           `json:"expires_at,omitempty"`
+	WorkflowRun        *ArtifactWorkflowRun `json:"workflow_run,omitempty"`
 }
 
 // ArtifactList represents a list of GitHub artifacts.
diff --git a/github/actions_artifacts_test.go b/github/actions_artifacts_test.go
index 345a087..de07c14 100644
--- a/github/actions_artifacts_test.go
+++ b/github/actions_artifacts_test.go
@@ -368,23 +368,6 @@ func TestActionsService_DownloadArtifact_StatusMovedPermanently_followRedirects(
 	}
 }
 
-func TestActionsService_DownloadArtifact_invalidLocationHeader(t *testing.T) {
-	client, mux, _, teardown := setup()
-	defer teardown()
-
-	mux.HandleFunc("/repos/o/r/actions/artifacts/1/zip", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, "GET")
-		ctlChar := 0x7f
-		badURL := "https://google.com" + string(byte(ctlChar))
-		w.Header().Add("Location", badURL)
-		w.WriteHeader(http.StatusFound)
-	})
-
-	ctx := context.Background()
-	_, _, err := client.Actions.DownloadArtifact(ctx, "o", "r", 1, false)
-	testURLParseError(t, err)
-}
-
 func TestActionsService_DeleteArtifact(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
@@ -455,10 +438,19 @@ func TestArtifact_Marshal(t *testing.T) {
 		NodeID:             String("nid"),
 		Name:               String("n"),
 		SizeInBytes:        Int64(1),
+		URL:                String("u"),
 		ArchiveDownloadURL: String("a"),
 		Expired:            Bool(false),
 		CreatedAt:          &Timestamp{referenceTime},
+		UpdatedAt:          &Timestamp{referenceTime},
 		ExpiresAt:          &Timestamp{referenceTime},
+		WorkflowRun: &ArtifactWorkflowRun{
+			ID:               Int64(1),
+			RepositoryID:     Int64(1),
+			HeadRepositoryID: Int64(1),
+			HeadBranch:       String("b"),
+			HeadSHA:          String("s"),
+		},
 	}
 
 	want := `{
@@ -466,10 +458,19 @@ func TestArtifact_Marshal(t *testing.T) {
 		"node_id": "nid",
 		"name": "n",
 		"size_in_bytes": 1,
+		"url": "u",
 		"archive_download_url": "a",
 		"expired": false,
 		"created_at": ` + referenceTimeStr + `,
-		"expires_at": ` + referenceTimeStr + `
+		"updated_at": ` + referenceTimeStr + `,
+		"expires_at": ` + referenceTimeStr + `,
+		"workflow_run": {
+			"id": 1,
+			"repository_id": 1,
+			"head_repository_id": 1,
+			"head_branch": "b",
+			"head_sha": "s"
+		}
 	}`
 
 	testJSONMarshal(t, u, want)
@@ -486,10 +487,19 @@ func TestArtifactList_Marshal(t *testing.T) {
 				NodeID:             String("nid"),
 				Name:               String("n"),
 				SizeInBytes:        Int64(1),
+				URL:                String("u"),
 				ArchiveDownloadURL: String("a"),
 				Expired:            Bool(false),
 				CreatedAt:          &Timestamp{referenceTime},
+				UpdatedAt:          &Timestamp{referenceTime},
 				ExpiresAt:          &Timestamp{referenceTime},
+				WorkflowRun: &ArtifactWorkflowRun{
+					ID:               Int64(1),
+					RepositoryID:     Int64(1),
+					HeadRepositoryID: Int64(1),
+					HeadBranch:       String("b"),
+					HeadSHA:          String("s"),
+				},
 			},
 		},
 	}
@@ -501,10 +511,19 @@ func TestArtifactList_Marshal(t *testing.T) {
 			"node_id": "nid",
 			"name": "n",
 			"size_in_bytes": 1,
+			"url": "u",
 			"archive_download_url": "a",
 			"expired": false,
 			"created_at": ` + referenceTimeStr + `,
-			"expires_at": ` + referenceTimeStr + `
+			"updated_at": ` + referenceTimeStr + `,
+			"expires_at": ` + referenceTimeStr + `,
+			"workflow_run": {
+				"id": 1,
+				"repository_id": 1,
+				"head_repository_id": 1,
+				"head_branch": "b",
+				"head_sha": "s"
+			}
 		}]
 	}`
 
diff --git a/github/actions_cache.go b/github/actions_cache.go
new file mode 100644
index 0000000..9592d9a
--- /dev/null
+++ b/github/actions_cache.go
@@ -0,0 +1,235 @@
+// Copyright 2022 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+)
+
+// ActionsCache represents a GitHub action cache.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#about-the-cache-api
+type ActionsCache struct {
+	ID             *int64     `json:"id,omitempty" url:"-"`
+	Ref            *string    `json:"ref,omitempty" url:"ref"`
+	Key            *string    `json:"key,omitempty" url:"key"`
+	Version        *string    `json:"version,omitempty" url:"-"`
+	LastAccessedAt *Timestamp `json:"last_accessed_at,omitempty" url:"-"`
+	CreatedAt      *Timestamp `json:"created_at,omitempty" url:"-"`
+	SizeInBytes    *int64     `json:"size_in_bytes,omitempty" url:"-"`
+}
+
+// ActionsCacheList represents a list of GitHub actions Cache.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#list-github-actions-caches-for-a-repository
+type ActionsCacheList struct {
+	TotalCount    int             `json:"total_count"`
+	ActionsCaches []*ActionsCache `json:"actions_caches,omitempty"`
+}
+
+// ActionsCacheUsage represents a GitHub Actions Cache Usage object.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#get-github-actions-cache-usage-for-a-repository
+type ActionsCacheUsage struct {
+	FullName                string `json:"full_name"`
+	ActiveCachesSizeInBytes int64  `json:"active_caches_size_in_bytes"`
+	ActiveCachesCount       int    `json:"active_caches_count"`
+}
+
+// ActionsCacheUsageList represents a list of repositories with GitHub Actions cache usage for an organization.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#get-github-actions-cache-usage-for-a-repository
+type ActionsCacheUsageList struct {
+	TotalCount     int                  `json:"total_count"`
+	RepoCacheUsage []*ActionsCacheUsage `json:"repository_cache_usages,omitempty"`
+}
+
+// TotalCacheUsage represents total GitHub actions cache usage of an organization or enterprise.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#get-github-actions-cache-usage-for-an-enterprise
+type TotalCacheUsage struct {
+	TotalActiveCachesUsageSizeInBytes int64 `json:"total_active_caches_size_in_bytes"`
+	TotalActiveCachesCount            int   `json:"total_active_caches_count"`
+}
+
+// ActionsCacheListOptions represents a list of all possible optional Query parameters for ListCaches method.
+//
+// GitHub API docs:  https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#list-github-actions-caches-for-a-repository
+type ActionsCacheListOptions struct {
+	ListOptions
+	// The Git reference for the results you want to list.
+	// The ref for a branch can be formatted either as refs/heads/<branch name>
+	// or simply <branch name>. To reference a pull request use refs/pull/<number>/merge
+	Ref *string `url:"ref,omitempty"`
+	Key *string `url:"key,omitempty"`
+	// Can be one of: "created_at", "last_accessed_at", "size_in_bytes". Default: "last_accessed_at"
+	Sort *string `url:"sort,omitempty"`
+	// Can be one of: "asc", "desc" Default: desc
+	Direction *string `url:"direction,omitempty"`
+}
+
+// ListCaches lists the GitHub Actions caches for a repository.
+// You must authenticate using an access token with the repo scope to use this endpoint.
+//
+// Permissions: must have the actions:read permission to use this endpoint.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#list-github-actions-caches-for-a-repository
+func (s *ActionsService) ListCaches(ctx context.Context, owner, repo string, opts *ActionsCacheListOptions) (*ActionsCacheList, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/caches", owner, repo)
+	u, err := addOptions(u, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	actionCacheList := new(ActionsCacheList)
+	resp, err := s.client.Do(ctx, req, actionCacheList)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return actionCacheList, resp, nil
+}
+
+// DeleteCachesByKey deletes one or more GitHub Actions caches for a repository, using a complete cache key.
+// By default, all caches that match the provided key are deleted, but you can optionally provide
+// a Git ref to restrict deletions to caches that match both the provided key and the Git ref.
+// The ref for a branch can be formatted either as "refs/heads/<branch name>" or simply "<branch name>".
+// To reference a pull request use "refs/pull/<number>/merge". If you don't want to use ref just pass nil in parameter.
+//
+// Permissions: You must authenticate using an access token with the repo scope to use this endpoint. GitHub Apps must have the actions:write permission to use this endpoint.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#delete-github-actions-caches-for-a-repository-using-a-cache-key
+func (s *ActionsService) DeleteCachesByKey(ctx context.Context, owner, repo, key string, ref *string) (*Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/caches", owner, repo)
+	u, err := addOptions(u, ActionsCache{Key: &key, Ref: ref})
+	if err != nil {
+		return nil, err
+	}
+
+	req, err := s.client.NewRequest("DELETE", u, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
+
+// DeleteCachesByID deletes a GitHub Actions cache for a repository, using a cache ID.
+//
+// Permissions: You must authenticate using an access token with the repo scope to use this endpoint. GitHub Apps must have the actions:write permission to use this endpoint.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#delete-a-github-actions-cache-for-a-repository-using-a-cache-id
+func (s *ActionsService) DeleteCachesByID(ctx context.Context, owner, repo string, cacheID int64) (*Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/caches/%v", owner, repo, cacheID)
+	req, err := s.client.NewRequest("DELETE", u, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
+
+// GetCacheUsageForRepo gets GitHub Actions cache usage for a repository. The data fetched using this API is refreshed approximately every 5 minutes,
+// so values returned from this endpoint may take at least 5 minutes to get updated.
+//
+// Permissions: Anyone with read access to the repository can use this endpoint. If the repository is private, you must use an
+// access token with the repo scope. GitHub Apps must have the actions:read permission to use this endpoint.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#get-github-actions-cache-usage-for-a-repository
+func (s *ActionsService) GetCacheUsageForRepo(ctx context.Context, owner, repo string) (*ActionsCacheUsage, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/cache/usage", owner, repo)
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	cacheUsage := new(ActionsCacheUsage)
+	res, err := s.client.Do(ctx, req, cacheUsage)
+	if err != nil {
+		return nil, res, err
+	}
+
+	return cacheUsage, res, err
+}
+
+// ListCacheUsageByRepoForOrg lists repositories and their GitHub Actions cache usage for an organization. The data fetched using this API is
+// refreshed approximately every 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated.
+//
+// Permissions: You must authenticate using an access token with the read:org scope to use this endpoint.
+// GitHub Apps must have the organization_admistration:read permission to use this endpoint.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#list-repositories-with-github-actions-cache-usage-for-an-organization
+func (s *ActionsService) ListCacheUsageByRepoForOrg(ctx context.Context, org string, opts *ListOptions) (*ActionsCacheUsageList, *Response, error) {
+	u := fmt.Sprintf("orgs/%v/actions/cache/usage-by-repository", org)
+	u, err := addOptions(u, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	cacheUsage := new(ActionsCacheUsageList)
+	res, err := s.client.Do(ctx, req, cacheUsage)
+	if err != nil {
+		return nil, res, err
+	}
+
+	return cacheUsage, res, err
+}
+
+// GetTotalCacheUsageForOrg gets the total GitHub Actions cache usage for an organization. The data fetched using this API is refreshed approximately every
+// 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated.
+//
+// Permissions: You must authenticate using an access token with the read:org scope to use this endpoint.
+// GitHub Apps must have the organization_admistration:read permission to use this endpoint.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#get-github-actions-cache-usage-for-an-organization
+func (s *ActionsService) GetTotalCacheUsageForOrg(ctx context.Context, org string) (*TotalCacheUsage, *Response, error) {
+	u := fmt.Sprintf("orgs/%v/actions/cache/usage", org)
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	cacheUsage := new(TotalCacheUsage)
+	res, err := s.client.Do(ctx, req, cacheUsage)
+	if err != nil {
+		return nil, res, err
+	}
+
+	return cacheUsage, res, err
+}
+
+// GetTotalCacheUsageForEnterprise gets the total GitHub Actions cache usage for an enterprise. The data fetched using this API is refreshed approximately every 5 minutes,
+// so values returned from this endpoint may take at least 5 minutes to get updated.
+//
+// Permissions: You must authenticate using an access token with the "admin:enterprise" scope to use this endpoint.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#get-github-actions-cache-usage-for-an-enterprise
+func (s *ActionsService) GetTotalCacheUsageForEnterprise(ctx context.Context, enterprise string) (*TotalCacheUsage, *Response, error) {
+	u := fmt.Sprintf("enterprises/%v/actions/cache/usage", enterprise)
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	cacheUsage := new(TotalCacheUsage)
+	res, err := s.client.Do(ctx, req, cacheUsage)
+	if err != nil {
+		return nil, res, err
+	}
+
+	return cacheUsage, res, err
+}
diff --git a/github/actions_cache_test.go b/github/actions_cache_test.go
new file mode 100644
index 0000000..b72d5cb
--- /dev/null
+++ b/github/actions_cache_test.go
@@ -0,0 +1,517 @@
+// Copyright 2022 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+)
+
+func TestActionsService_ListCaches(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/caches", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"page": "2"})
+		fmt.Fprint(w,
+			`{
+				"total_count":1,
+				"actions_caches":[{"id":1}]
+			}`,
+		)
+	})
+
+	opts := &ActionsCacheListOptions{ListOptions: ListOptions{Page: 2}}
+	ctx := context.Background()
+	cacheList, _, err := client.Actions.ListCaches(ctx, "o", "r", opts)
+	if err != nil {
+		t.Errorf("Actions.ListCaches returned error: %v", err)
+	}
+
+	want := &ActionsCacheList{TotalCount: 1, ActionsCaches: []*ActionsCache{{ID: Int64(1)}}}
+	if !cmp.Equal(cacheList, want) {
+		t.Errorf("Actions.ListCaches returned %+v, want %+v", cacheList, want)
+	}
+
+	const methodName = "ListCaches"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListCaches(ctx, "\n", "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListCaches(ctx, "o", "r", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_ListCaches_invalidOwner(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, _, err := client.Actions.ListCaches(ctx, "%", "r", nil)
+	testURLParseError(t, err)
+}
+
+func TestActionsService_ListCaches_invalidRepo(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, _, err := client.Actions.ListCaches(ctx, "o", "%", nil)
+	testURLParseError(t, err)
+}
+
+func TestActionsService_ListCaches_notFound(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/caches", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		w.WriteHeader(http.StatusNotFound)
+	})
+
+	ctx := context.Background()
+	caches, resp, err := client.Actions.ListCaches(ctx, "o", "r", nil)
+	if err == nil {
+		t.Errorf("Expected HTTP 404 response")
+	}
+	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
+		t.Errorf("Actions.ListCaches return status %d, want %d", got, want)
+	}
+	if caches != nil {
+		t.Errorf("Actions.ListCaches return %+v, want nil", caches)
+	}
+}
+
+func TestActionsService_DeleteCachesByKey(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/caches", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+		testFormValues(t, r, values{"key": "1", "ref": "main"})
+	})
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteCachesByKey(ctx, "o", "r", "1", String("main"))
+	if err != nil {
+		t.Errorf("Actions.DeleteCachesByKey return error: %v", err)
+	}
+
+	const methodName = "DeleteCachesByKey"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.DeleteCachesByKey(ctx, "\n", "\n", "\n", String("\n"))
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.DeleteCachesByKey(ctx, "o", "r", "1", String("main"))
+	})
+}
+
+func TestActionsService_DeleteCachesByKey_invalidOwner(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteCachesByKey(ctx, "%", "r", "1", String("main"))
+	testURLParseError(t, err)
+}
+
+func TestActionsService_DeleteCachesByKey_invalidRepo(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteCachesByKey(ctx, "o", "%", "1", String("main"))
+	testURLParseError(t, err)
+}
+func TestActionsService_DeleteCachesByKey_notFound(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/artifacts/1", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+		w.WriteHeader(http.StatusNotFound)
+	})
+
+	ctx := context.Background()
+	resp, err := client.Actions.DeleteCachesByKey(ctx, "o", "r", "1", String("main"))
+	if err == nil {
+		t.Errorf("Expected HTTP 404 response")
+	}
+	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
+		t.Errorf("Actions.DeleteCachesByKey return status %d, want %d", got, want)
+	}
+}
+
+func TestActionsService_DeleteCachesByID(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/caches/1", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+	})
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteCachesByID(ctx, "o", "r", 1)
+	if err != nil {
+		t.Errorf("Actions.DeleteCachesByID return error: %v", err)
+	}
+
+	const methodName = "DeleteCachesByID"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.DeleteCachesByID(ctx, "\n", "\n", 0)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.DeleteCachesByID(ctx, "o", "r", 1)
+	})
+}
+
+func TestActionsService_DeleteCachesByID_invalidOwner(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteCachesByID(ctx, "%", "r", 1)
+	testURLParseError(t, err)
+}
+
+func TestActionsService_DeleteCachesByID_invalidRepo(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteCachesByID(ctx, "o", "%", 1)
+	testURLParseError(t, err)
+}
+
+func TestActionsService_DeleteCachesByID_notFound(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("repos/o/r/actions/caches/1", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+		w.WriteHeader(http.StatusNotFound)
+	})
+
+	ctx := context.Background()
+	resp, err := client.Actions.DeleteCachesByID(ctx, "o", "r", 1)
+	if err == nil {
+		t.Errorf("Expected HTTP 404 response")
+	}
+	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
+		t.Errorf("Actions.DeleteCachesByID return status %d, want %d", got, want)
+	}
+}
+
+func TestActionsService_GetCacheUsageForRepo(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w,
+			`{
+				"full_name":"test-cache",
+				"active_caches_size_in_bytes":1000,
+				"active_caches_count":1
+			}`,
+		)
+	})
+
+	ctx := context.Background()
+	cacheUse, _, err := client.Actions.GetCacheUsageForRepo(ctx, "o", "r")
+	if err != nil {
+		t.Errorf("Actions.GetCacheUsageForRepo returned error: %v", err)
+	}
+
+	want := &ActionsCacheUsage{FullName: "test-cache", ActiveCachesSizeInBytes: 1000, ActiveCachesCount: 1}
+	if !cmp.Equal(cacheUse, want) {
+		t.Errorf("Actions.GetCacheUsageForRepo returned %+v, want %+v", cacheUse, want)
+	}
+
+	const methodName = "GetCacheUsageForRepo"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetCacheUsageForRepo(ctx, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetCacheUsageForRepo(ctx, "o", "r")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_GetCacheUsageForRepo_invalidOwner(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, _, err := client.Actions.GetCacheUsageForRepo(ctx, "%", "r")
+	testURLParseError(t, err)
+}
+
+func TestActionsService_GetCacheUsageForRepo_invalidRepo(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, _, err := client.Actions.GetCacheUsageForRepo(ctx, "o", "%")
+	testURLParseError(t, err)
+}
+
+func TestActionsService_GetCacheUsageForRepo_notFound(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		w.WriteHeader(http.StatusNotFound)
+	})
+
+	ctx := context.Background()
+	caches, resp, err := client.Actions.GetCacheUsageForRepo(ctx, "o", "r")
+	if err == nil {
+		t.Errorf("Expected HTTP 404 response")
+	}
+	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
+		t.Errorf("Actions.GetCacheUsageForRepo return status %d, want %d", got, want)
+	}
+	if caches != nil {
+		t.Errorf("Actions.GetCacheUsageForRepo return %+v, want nil", caches)
+	}
+}
+
+func TestActionsService_ListCacheUsageByRepoForOrg(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/cache/usage-by-repository", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"page": "2", "per_page": "1"})
+		fmt.Fprint(w,
+			`{
+				"total_count":1,
+				"repository_cache_usages":[{"full_name":"test-cache","active_caches_size_in_bytes":1000,"active_caches_count":1}]
+			}`,
+		)
+	})
+
+	opts := &ListOptions{PerPage: 1, Page: 2}
+	ctx := context.Background()
+	cacheList, _, err := client.Actions.ListCacheUsageByRepoForOrg(ctx, "o", opts)
+	if err != nil {
+		t.Errorf("Actions.ListCacheUsageByRepoForOrg returned error: %v", err)
+	}
+
+	want := &ActionsCacheUsageList{TotalCount: 1, RepoCacheUsage: []*ActionsCacheUsage{{FullName: "test-cache", ActiveCachesSizeInBytes: 1000, ActiveCachesCount: 1}}}
+	if !cmp.Equal(cacheList, want) {
+		t.Errorf("Actions.ListCacheUsageByRepoForOrg returned %+v, want %+v", cacheList, want)
+	}
+
+	const methodName = "ListCacheUsageByRepoForOrg"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListCacheUsageByRepoForOrg(ctx, "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListCacheUsageByRepoForOrg(ctx, "o", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_ListCacheUsageByRepoForOrg_invalidOrganization(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, _, err := client.Actions.ListCacheUsageByRepoForOrg(ctx, "%", nil)
+	testURLParseError(t, err)
+}
+
+func TestActionsService_ListCacheUsageByRepoForOrg_notFound(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/cache/usage-by-repository", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		w.WriteHeader(http.StatusNotFound)
+	})
+
+	ctx := context.Background()
+	caches, resp, err := client.Actions.ListCacheUsageByRepoForOrg(ctx, "o", nil)
+	if err == nil {
+		t.Errorf("Expected HTTP 404 response")
+	}
+	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
+		t.Errorf("Actions.ListCacheUsageByRepoForOrg return status %d, want %d", got, want)
+	}
+	if caches != nil {
+		t.Errorf("Actions.ListCacheUsageByRepoForOrg return %+v, want nil", caches)
+	}
+}
+
+func TestActionsService_GetCacheUsageForOrg(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w,
+			`{
+				"total_active_caches_size_in_bytes":1000,
+				"total_active_caches_count":1
+			}`,
+		)
+	})
+
+	ctx := context.Background()
+	cache, _, err := client.Actions.GetTotalCacheUsageForOrg(ctx, "o")
+	if err != nil {
+		t.Errorf("Actions.GetTotalCacheUsageForOrg returned error: %v", err)
+	}
+
+	want := &TotalCacheUsage{TotalActiveCachesUsageSizeInBytes: 1000, TotalActiveCachesCount: 1}
+	if !cmp.Equal(cache, want) {
+		t.Errorf("Actions.GetTotalCacheUsageForOrg returned %+v, want %+v", cache, want)
+	}
+
+	const methodName = "GetTotalCacheUsageForOrg"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetTotalCacheUsageForOrg(ctx, "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetTotalCacheUsageForOrg(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_GetCacheUsageForOrg_invalidOrganization(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, _, err := client.Actions.GetTotalCacheUsageForOrg(ctx, "%")
+	testURLParseError(t, err)
+}
+
+func TestActionsService_GetCacheUsageForOrg_notFound(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		w.WriteHeader(http.StatusNotFound)
+	})
+
+	ctx := context.Background()
+	caches, resp, err := client.Actions.GetTotalCacheUsageForOrg(ctx, "o")
+	if err == nil {
+		t.Errorf("Expected HTTP 404 response")
+	}
+	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
+		t.Errorf("Actions.GetTotalCacheUsageForOrg return status %d, want %d", got, want)
+	}
+	if caches != nil {
+		t.Errorf("Actions.GetTotalCacheUsageForOrg return %+v, want nil", caches)
+	}
+}
+
+func TestActionsService_GetCacheUsageForEnterprise(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/enterprises/e/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w,
+			`{
+				"total_active_caches_size_in_bytes":1000,
+				"total_active_caches_count":1
+			}`,
+		)
+	})
+
+	ctx := context.Background()
+	cache, _, err := client.Actions.GetTotalCacheUsageForEnterprise(ctx, "e")
+	if err != nil {
+		t.Errorf("Actions.GetTotalCacheUsageForEnterprise returned error: %v", err)
+	}
+
+	want := &TotalCacheUsage{TotalActiveCachesUsageSizeInBytes: 1000, TotalActiveCachesCount: 1}
+	if !cmp.Equal(cache, want) {
+		t.Errorf("Actions.GetTotalCacheUsageForEnterprise returned %+v, want %+v", cache, want)
+	}
+
+	const methodName = "GetTotalCacheUsageForEnterprise"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetTotalCacheUsageForEnterprise(ctx, "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetTotalCacheUsageForEnterprise(ctx, "e")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_GetCacheUsageForEnterprise_invalidEnterprise(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, _, err := client.Actions.GetTotalCacheUsageForEnterprise(ctx, "%")
+	testURLParseError(t, err)
+}
+
+func TestActionsService_GetCacheUsageForEnterprise_notFound(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/enterprises/e/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		w.WriteHeader(http.StatusNotFound)
+	})
+
+	ctx := context.Background()
+	caches, resp, err := client.Actions.GetTotalCacheUsageForEnterprise(ctx, "o")
+	if err == nil {
+		t.Errorf("Expected HTTP 404 response")
+	}
+	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
+		t.Errorf("Actions.GetTotalCacheUsageForEnterprise return status %d, want %d", got, want)
+	}
+	if caches != nil {
+		t.Errorf("Actions.GetTotalCacheUsageForEnterprise return %+v, want nil", caches)
+	}
+}
diff --git a/github/actions_oidc.go b/github/actions_oidc.go
new file mode 100644
index 0000000..b7f2d26
--- /dev/null
+++ b/github/actions_oidc.go
@@ -0,0 +1,73 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+)
+
+// OIDCSubjectClaimCustomTemplate represents an OIDC subject claim customization template.
+type OIDCSubjectClaimCustomTemplate struct {
+	UseDefault       *bool    `json:"use_default,omitempty"`
+	IncludeClaimKeys []string `json:"include_claim_keys,omitempty"`
+}
+
+// GetOrgOIDCSubjectClaimCustomTemplate gets the subject claim customization template for an organization.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/oidc#get-the-customization-template-for-an-oidc-subject-claim-for-an-organization
+func (s *ActionsService) GetOrgOIDCSubjectClaimCustomTemplate(ctx context.Context, org string) (*OIDCSubjectClaimCustomTemplate, *Response, error) {
+	u := fmt.Sprintf("orgs/%v/actions/oidc/customization/sub", org)
+	return s.getOIDCSubjectClaimCustomTemplate(ctx, u)
+}
+
+// GetRepoOIDCSubjectClaimCustomTemplate gets the subject claim customization template for a repository.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/oidc#get-the-customization-template-for-an-oidc-subject-claim-for-a-repository
+func (s *ActionsService) GetRepoOIDCSubjectClaimCustomTemplate(ctx context.Context, owner, repo string) (*OIDCSubjectClaimCustomTemplate, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/oidc/customization/sub", owner, repo)
+	return s.getOIDCSubjectClaimCustomTemplate(ctx, u)
+}
+
+func (s *ActionsService) getOIDCSubjectClaimCustomTemplate(ctx context.Context, url string) (*OIDCSubjectClaimCustomTemplate, *Response, error) {
+	req, err := s.client.NewRequest("GET", url, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	tmpl := new(OIDCSubjectClaimCustomTemplate)
+	resp, err := s.client.Do(ctx, req, tmpl)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return tmpl, resp, nil
+}
+
+// SetOrgOIDCSubjectClaimCustomTemplate sets the subject claim customization for an organization.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/oidc#set-the-customization-template-for-an-oidc-subject-claim-for-an-organization
+func (s *ActionsService) SetOrgOIDCSubjectClaimCustomTemplate(ctx context.Context, org string, template *OIDCSubjectClaimCustomTemplate) (*Response, error) {
+	u := fmt.Sprintf("orgs/%v/actions/oidc/customization/sub", org)
+	return s.setOIDCSubjectClaimCustomTemplate(ctx, u, template)
+}
+
+// SetRepoOIDCSubjectClaimCustomTemplate sets the subject claim customization for a repository.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/oidc#set-the-customization-template-for-an-oidc-subject-claim-for-a-repository
+func (s *ActionsService) SetRepoOIDCSubjectClaimCustomTemplate(ctx context.Context, owner, repo string, template *OIDCSubjectClaimCustomTemplate) (*Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/oidc/customization/sub", owner, repo)
+	return s.setOIDCSubjectClaimCustomTemplate(ctx, u, template)
+}
+
+func (s *ActionsService) setOIDCSubjectClaimCustomTemplate(ctx context.Context, url string, template *OIDCSubjectClaimCustomTemplate) (*Response, error) {
+	req, err := s.client.NewRequest("PUT", url, template)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
diff --git a/github/actions_oidc_test.go b/github/actions_oidc_test.go
new file mode 100644
index 0000000..c56dfef
--- /dev/null
+++ b/github/actions_oidc_test.go
@@ -0,0 +1,181 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+)
+
+func TestActionsService_GetOrgOIDCSubjectClaimCustomTemplate(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{"include_claim_keys":["repo","context"]}`)
+	})
+
+	ctx := context.Background()
+	template, _, err := client.Actions.GetOrgOIDCSubjectClaimCustomTemplate(ctx, "o")
+	if err != nil {
+		t.Errorf("Actions.GetOrgOIDCSubjectClaimCustomTemplate returned error: %v", err)
+	}
+
+	want := &OIDCSubjectClaimCustomTemplate{IncludeClaimKeys: []string{"repo", "context"}}
+	if !cmp.Equal(template, want) {
+		t.Errorf("Actions.GetOrgOIDCSubjectClaimCustomTemplate returned %+v, want %+v", template, want)
+	}
+
+	const methodName = "GetOrgOIDCSubjectClaimCustomTemplate"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetOrgOIDCSubjectClaimCustomTemplate(ctx, "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetOrgOIDCSubjectClaimCustomTemplate(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_GetRepoOIDCSubjectClaimCustomTemplate(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{"use_default":false,"include_claim_keys":["repo","context"]}`)
+	})
+
+	ctx := context.Background()
+	template, _, err := client.Actions.GetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r")
+	if err != nil {
+		t.Errorf("Actions.GetRepoOIDCSubjectClaimCustomTemplate returned error: %v", err)
+	}
+
+	want := &OIDCSubjectClaimCustomTemplate{UseDefault: Bool(false), IncludeClaimKeys: []string{"repo", "context"}}
+	if !cmp.Equal(template, want) {
+		t.Errorf("Actions.GetOrgOIDCSubjectClaimCustomTemplate returned %+v, want %+v", template, want)
+	}
+
+	const methodName = "GetRepoOIDCSubjectClaimCustomTemplate"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetRepoOIDCSubjectClaimCustomTemplate(ctx, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_SetOrgOIDCSubjectClaimCustomTemplate(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"include_claim_keys":["repo","context"]}`+"\n")
+		w.WriteHeader(http.StatusCreated)
+	})
+
+	input := &OIDCSubjectClaimCustomTemplate{
+		IncludeClaimKeys: []string{"repo", "context"},
+	}
+	ctx := context.Background()
+	_, err := client.Actions.SetOrgOIDCSubjectClaimCustomTemplate(ctx, "o", input)
+	if err != nil {
+		t.Errorf("Actions.SetOrgOIDCSubjectClaimCustomTemplate returned error: %v", err)
+	}
+
+	const methodName = "SetOrgOIDCSubjectClaimCustomTemplate"
+
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.SetOrgOIDCSubjectClaimCustomTemplate(ctx, "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.SetOrgOIDCSubjectClaimCustomTemplate(ctx, "o", input)
+	})
+}
+
+func TestActionsService_SetRepoOIDCSubjectClaimCustomTemplate(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"use_default":false,"include_claim_keys":["repo","context"]}`+"\n")
+		w.WriteHeader(http.StatusCreated)
+	})
+
+	input := &OIDCSubjectClaimCustomTemplate{
+		UseDefault:       Bool(false),
+		IncludeClaimKeys: []string{"repo", "context"},
+	}
+	ctx := context.Background()
+	_, err := client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r", input)
+	if err != nil {
+		t.Errorf("Actions.SetRepoOIDCSubjectClaimCustomTemplate returned error: %v", err)
+	}
+
+	const methodName = "SetRepoOIDCSubjectClaimCustomTemplate"
+
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r", input)
+	})
+}
+
+func TestActionService_SetRepoOIDCSubjectClaimCustomTemplateToDefault(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"use_default":true}`+"\n")
+		w.WriteHeader(http.StatusCreated)
+	})
+
+	input := &OIDCSubjectClaimCustomTemplate{
+		UseDefault: Bool(true),
+	}
+	ctx := context.Background()
+	_, err := client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r", input)
+	if err != nil {
+		t.Errorf("Actions.SetRepoOIDCSubjectClaimCustomTemplate returned error: %v", err)
+	}
+
+	const methodName = "SetRepoOIDCSubjectClaimCustomTemplate"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r", input)
+	})
+}
diff --git a/github/actions_required_workflows.go b/github/actions_required_workflows.go
new file mode 100644
index 0000000..11b96f6
--- /dev/null
+++ b/github/actions_required_workflows.go
@@ -0,0 +1,247 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+)
+
+// OrgRequiredWorkflow represents a required workflow object at the org level.
+type OrgRequiredWorkflow struct {
+	ID                      *int64      `json:"id,omitempty"`
+	Name                    *string     `json:"name,omitempty"`
+	Path                    *string     `json:"path,omitempty"`
+	Scope                   *string     `json:"scope,omitempty"`
+	Ref                     *string     `json:"ref,omitempty"`
+	State                   *string     `json:"state,omitempty"`
+	SelectedRepositoriesURL *string     `json:"selected_repositories_url,omitempty"`
+	CreatedAt               *Timestamp  `json:"created_at,omitempty"`
+	UpdatedAt               *Timestamp  `json:"updated_at,omitempty"`
+	Repository              *Repository `json:"repository,omitempty"`
+}
+
+// OrgRequiredWorkflows represents the required workflows for the org.
+type OrgRequiredWorkflows struct {
+	TotalCount        *int                   `json:"total_count,omitempty"`
+	RequiredWorkflows []*OrgRequiredWorkflow `json:"required_workflows,omitempty"`
+}
+
+// CreateUpdateRequiredWorkflowOptions represents the input object used to create or update required workflows.
+type CreateUpdateRequiredWorkflowOptions struct {
+	WorkflowFilePath      *string          `json:"workflow_file_path,omitempty"`
+	RepositoryID          *int64           `json:"repository_id,omitempty"`
+	Scope                 *string          `json:"scope,omitempty"`
+	SelectedRepositoryIDs *SelectedRepoIDs `json:"selected_repository_ids,omitempty"`
+}
+
+// RequiredWorkflowSelectedRepos represents the repos that a required workflow is applied to.
+type RequiredWorkflowSelectedRepos struct {
+	TotalCount   *int          `json:"total_count,omitempty"`
+	Repositories []*Repository `json:"repositories,omitempty"`
+}
+
+// RepoRequiredWorkflow represents a required workflow object at the repo level.
+type RepoRequiredWorkflow struct {
+	ID               *int64      `json:"id,omitempty"`
+	NodeID           *string     `json:"node_id,omitempty"`
+	Name             *string     `json:"name,omitempty"`
+	Path             *string     `json:"path,omitempty"`
+	State            *string     `json:"state,omitempty"`
+	URL              *string     `json:"url,omitempty"`
+	HTMLURL          *string     `json:"html_url,omitempty"`
+	BadgeURL         *string     `json:"badge_url,omitempty"`
+	CreatedAt        *Timestamp  `json:"created_at,omitempty"`
+	UpdatedAt        *Timestamp  `json:"updated_at,omitempty"`
+	SourceRepository *Repository `json:"source_repository,omitempty"`
+}
+
+// RepoRequiredWorkflows represents the required workflows for a repo.
+type RepoRequiredWorkflows struct {
+	TotalCount        *int                    `json:"total_count,omitempty"`
+	RequiredWorkflows []*RepoRequiredWorkflow `json:"required_workflows,omitempty"`
+}
+
+// ListOrgRequiredWorkflows lists the RequiredWorkflows for an org.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#list-required-workflows
+func (s *ActionsService) ListOrgRequiredWorkflows(ctx context.Context, org string, opts *ListOptions) (*OrgRequiredWorkflows, *Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/required_workflows", org)
+	u, err := addOptions(url, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	requiredWorkflows := new(OrgRequiredWorkflows)
+	resp, err := s.client.Do(ctx, req, &requiredWorkflows)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return requiredWorkflows, resp, nil
+}
+
+// CreateRequiredWorkflow creates the required workflow in an org.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#create-a-required-workflow
+func (s *ActionsService) CreateRequiredWorkflow(ctx context.Context, org string, createRequiredWorkflowOptions *CreateUpdateRequiredWorkflowOptions) (*OrgRequiredWorkflow, *Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/required_workflows", org)
+	req, err := s.client.NewRequest("PUT", url, createRequiredWorkflowOptions)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	orgRequiredWorkflow := new(OrgRequiredWorkflow)
+	resp, err := s.client.Do(ctx, req, orgRequiredWorkflow)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return orgRequiredWorkflow, resp, nil
+}
+
+// GetRequiredWorkflowByID get the RequiredWorkflows for an org by its ID.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#list-required-workflows
+func (s *ActionsService) GetRequiredWorkflowByID(ctx context.Context, owner string, requiredWorkflowID int64) (*OrgRequiredWorkflow, *Response, error) {
+	u := fmt.Sprintf("orgs/%v/actions/required_workflows/%v", owner, requiredWorkflowID)
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	requiredWorkflow := new(OrgRequiredWorkflow)
+	resp, err := s.client.Do(ctx, req, &requiredWorkflow)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return requiredWorkflow, resp, nil
+}
+
+// UpdateRequiredWorkflow updates a required workflow in an org.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#update-a-required-workflow
+func (s *ActionsService) UpdateRequiredWorkflow(ctx context.Context, org string, requiredWorkflowID int64, updateRequiredWorkflowOptions *CreateUpdateRequiredWorkflowOptions) (*OrgRequiredWorkflow, *Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v", org, requiredWorkflowID)
+	req, err := s.client.NewRequest("PATCH", url, updateRequiredWorkflowOptions)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	orgRequiredWorkflow := new(OrgRequiredWorkflow)
+	resp, err := s.client.Do(ctx, req, orgRequiredWorkflow)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return orgRequiredWorkflow, resp, nil
+}
+
+// DeleteRequiredWorkflow deletes a required workflow in an org.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#update-a-required-workflow
+func (s *ActionsService) DeleteRequiredWorkflow(ctx context.Context, org string, requiredWorkflowID int64) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v", org, requiredWorkflowID)
+	req, err := s.client.NewRequest("DELETE", url, nil)
+	if err != nil {
+		return nil, err
+	}
+	return s.client.Do(ctx, req, nil)
+}
+
+// ListRequiredWorkflowSelectedRepos lists the Repositories selected for a workflow.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#list-selected-repositories-for-a-required-workflow
+func (s *ActionsService) ListRequiredWorkflowSelectedRepos(ctx context.Context, org string, requiredWorkflowID int64, opts *ListOptions) (*RequiredWorkflowSelectedRepos, *Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v/repositories", org, requiredWorkflowID)
+	u, err := addOptions(url, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	requiredWorkflowRepos := new(RequiredWorkflowSelectedRepos)
+	resp, err := s.client.Do(ctx, req, &requiredWorkflowRepos)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return requiredWorkflowRepos, resp, nil
+}
+
+// SetRequiredWorkflowSelectedRepos sets the Repositories selected for a workflow.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#sets-repositories-for-a-required-workflow
+func (s *ActionsService) SetRequiredWorkflowSelectedRepos(ctx context.Context, org string, requiredWorkflowID int64, ids SelectedRepoIDs) (*Response, error) {
+	type repoIDs struct {
+		SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"`
+	}
+	url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v/repositories", org, requiredWorkflowID)
+	req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids})
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
+
+// AddRepoToRequiredWorkflow adds the Repository to a required workflow.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#add-a-repository-to-a-required-workflow
+func (s *ActionsService) AddRepoToRequiredWorkflow(ctx context.Context, org string, requiredWorkflowID, repoID int64) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v/repositories/%v", org, requiredWorkflowID, repoID)
+	req, err := s.client.NewRequest("PUT", url, nil)
+	if err != nil {
+		return nil, err
+	}
+	return s.client.Do(ctx, req, nil)
+}
+
+// RemoveRepoFromRequiredWorkflow removes the Repository from a required workflow.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#add-a-repository-to-a-required-workflow
+func (s *ActionsService) RemoveRepoFromRequiredWorkflow(ctx context.Context, org string, requiredWorkflowID, repoID int64) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v/repositories/%v", org, requiredWorkflowID, repoID)
+	req, err := s.client.NewRequest("DELETE", url, nil)
+	if err != nil {
+		return nil, err
+	}
+	return s.client.Do(ctx, req, nil)
+}
+
+// ListRepoRequiredWorkflows lists the RequiredWorkflows for a repo.
+//
+// Github API docs:https://docs.github.com/en/rest/actions/required-workflows?apiVersion=2022-11-28#list-repository-required-workflows
+func (s *ActionsService) ListRepoRequiredWorkflows(ctx context.Context, owner, repo string, opts *ListOptions) (*RepoRequiredWorkflows, *Response, error) {
+	url := fmt.Sprintf("repos/%v/%v/actions/required_workflows", owner, repo)
+	u, err := addOptions(url, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	requiredWorkflows := new(RepoRequiredWorkflows)
+	resp, err := s.client.Do(ctx, req, &requiredWorkflows)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return requiredWorkflows, resp, nil
+}
diff --git a/github/actions_required_workflows_test.go b/github/actions_required_workflows_test.go
new file mode 100644
index 0000000..4298caa
--- /dev/null
+++ b/github/actions_required_workflows_test.go
@@ -0,0 +1,469 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"testing"
+	"time"
+
+	"github.com/google/go-cmp/cmp"
+)
+
+func TestActionsService_ListOrgRequiredWorkflows(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"per_page": "2", "page": "2"})
+		fmt.Fprint(w, `{"total_count":4,"required_workflows": [
+			{
+			  "id": 30433642,
+			  "name": "Required CI",
+			  "path": ".github/workflows/ci.yml",
+			  "scope": "selected",
+			  "ref": "refs/head/main",
+			  "state": "active",
+			  "selected_repositories_url": "https://api.github.com/organizations/org/actions/required_workflows/1/repositories",
+			  "created_at": "2020-01-22T19:33:08Z",
+			  "updated_at": "2020-01-22T19:33:08Z"
+			},
+			{
+			  "id": 30433643,
+			  "name": "Required Linter",
+			  "path": ".github/workflows/lint.yml",
+			  "scope": "all",
+			  "ref": "refs/head/main",
+			  "state": "active",
+			  "created_at": "2020-01-22T19:33:08Z",
+			  "updated_at": "2020-01-22T19:33:08Z"
+			}
+		  ]
+		}`)
+	})
+	opts := &ListOptions{Page: 2, PerPage: 2}
+	ctx := context.Background()
+	jobs, _, err := client.Actions.ListOrgRequiredWorkflows(ctx, "o", opts)
+
+	if err != nil {
+		t.Errorf("Actions.ListOrgRequiredWorkflows returned error: %v", err)
+	}
+
+	want := &OrgRequiredWorkflows{
+		TotalCount: Int(4),
+		RequiredWorkflows: []*OrgRequiredWorkflow{
+			{ID: Int64(30433642), Name: String("Required CI"), Path: String(".github/workflows/ci.yml"), Scope: String("selected"), Ref: String("refs/head/main"), State: String("active"), SelectedRepositoriesURL: String("https://api.github.com/organizations/org/actions/required_workflows/1/repositories"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}},
+			{ID: Int64(30433643), Name: String("Required Linter"), Path: String(".github/workflows/lint.yml"), Scope: String("all"), Ref: String("refs/head/main"), State: String("active"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}},
+		},
+	}
+	if !cmp.Equal(jobs, want) {
+		t.Errorf("Actions.ListOrgRequiredWorkflows returned %+v, want %+v", jobs, want)
+	}
+	const methodName = "ListOrgRequiredWorkflows"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListOrgRequiredWorkflows(ctx, "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListOrgRequiredWorkflows(ctx, "o", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_CreateRequiredWorkflow(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"workflow_file_path":".github/workflows/ci.yaml","repository_id":53,"scope":"selected","selected_repository_ids":[32,91]}`+"\n")
+		fmt.Fprint(w, `{
+			"id": 2,
+			"name": "Required CI",
+			"path": ".github/workflows/ci.yml",
+			"scope": "selected",
+			"ref": "refs/head/main",
+			"state": "active",
+			"selected_repositories_url": "https://api.github.com/orgs/octo-org/actions/required_workflows/2/repositories",
+			"created_at": "2020-01-22T19:33:08Z",
+			"updated_at": "2020-01-22T19:33:08Z",
+			"repository": {
+				"id": 53,
+				"name": "Hello-World",
+				"url": "https://api.github.com/repos/o/Hello-World"}}`)
+	})
+	input := &CreateUpdateRequiredWorkflowOptions{
+		WorkflowFilePath:      String(".github/workflows/ci.yaml"),
+		RepositoryID:          Int64(53),
+		Scope:                 String("selected"),
+		SelectedRepositoryIDs: &SelectedRepoIDs{32, 91},
+	}
+	ctx := context.Background()
+	requiredWokflow, _, err := client.Actions.CreateRequiredWorkflow(ctx, "o", input)
+	if err != nil {
+		t.Errorf("Actions.CreateRequiredWorkflow returned error: %v", err)
+	}
+	want := &OrgRequiredWorkflow{
+		ID:                      Int64(2),
+		Name:                    String("Required CI"),
+		Path:                    String(".github/workflows/ci.yml"),
+		Scope:                   String("selected"),
+		Ref:                     String("refs/head/main"),
+		State:                   String("active"),
+		SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/required_workflows/2/repositories"),
+		CreatedAt:               &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)},
+		UpdatedAt:               &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)},
+		Repository:              &Repository{ID: Int64(53), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")},
+	}
+
+	if !cmp.Equal(requiredWokflow, want) {
+		t.Errorf("Actions.CreateRequiredWorkflow returned %+v, want %+v", requiredWokflow, want)
+	}
+
+	const methodName = "CreateRequiredWorkflow"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.CreateRequiredWorkflow(ctx, "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.CreateRequiredWorkflow(ctx, "o", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_GetRequiredWorkflowByID(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows/12345", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{
+			"id": 12345,
+			"name": "Required CI",
+			"path": ".github/workflows/ci.yml",
+			"scope": "selected",
+			"ref": "refs/head/main",
+			"state": "active",
+			"selected_repositories_url": "https://api.github.com/orgs/o/actions/required_workflows/12345/repositories",
+			"created_at": "2020-01-22T19:33:08Z",
+			"updated_at": "2020-01-22T19:33:08Z",
+			"repository":{
+				"id": 1296269,
+				"url": "https://api.github.com/repos/o/Hello-World",
+				"name": "Hello-World"
+			}
+			}`)
+	})
+	ctx := context.Background()
+	jobs, _, err := client.Actions.GetRequiredWorkflowByID(ctx, "o", 12345)
+
+	if err != nil {
+		t.Errorf("Actions.GetRequiredWorkflowByID returned error: %v", err)
+	}
+
+	want := &OrgRequiredWorkflow{
+		ID: Int64(12345), Name: String("Required CI"), Path: String(".github/workflows/ci.yml"), Scope: String("selected"), Ref: String("refs/head/main"), State: String("active"), SelectedRepositoriesURL: String("https://api.github.com/orgs/o/actions/required_workflows/12345/repositories"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, Repository: &Repository{ID: Int64(1296269), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")},
+	}
+	if !cmp.Equal(jobs, want) {
+		t.Errorf("Actions.GetRequiredWorkflowByID returned %+v, want %+v", jobs, want)
+	}
+	const methodName = "GetRequiredWorkflowByID"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetRequiredWorkflowByID(ctx, "\n", 1)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetRequiredWorkflowByID(ctx, "o", 12345)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_UpdateRequiredWorkflow(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows/12345", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PATCH")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"workflow_file_path":".github/workflows/ci.yaml","repository_id":53,"scope":"selected","selected_repository_ids":[32,91]}`+"\n")
+		fmt.Fprint(w, `{
+			"id": 12345,
+			"name": "Required CI",
+			"path": ".github/workflows/ci.yml",
+			"scope": "selected",
+			"ref": "refs/head/main",
+			"state": "active",
+			"selected_repositories_url": "https://api.github.com/orgs/octo-org/actions/required_workflows/12345/repositories",
+			"created_at": "2020-01-22T19:33:08Z",
+			"updated_at": "2020-01-22T19:33:08Z",
+			"repository": {
+				"id": 53,
+				"name": "Hello-World",
+				"url": "https://api.github.com/repos/o/Hello-World"}}`)
+	})
+	input := &CreateUpdateRequiredWorkflowOptions{
+		WorkflowFilePath:      String(".github/workflows/ci.yaml"),
+		RepositoryID:          Int64(53),
+		Scope:                 String("selected"),
+		SelectedRepositoryIDs: &SelectedRepoIDs{32, 91},
+	}
+	ctx := context.Background()
+
+	requiredWokflow, _, err := client.Actions.UpdateRequiredWorkflow(ctx, "o", 12345, input)
+
+	if err != nil {
+		t.Errorf("Actions.UpdateRequiredWorkflow returned error: %v", err)
+	}
+	want := &OrgRequiredWorkflow{
+		ID:                      Int64(12345),
+		Name:                    String("Required CI"),
+		Path:                    String(".github/workflows/ci.yml"),
+		Scope:                   String("selected"),
+		Ref:                     String("refs/head/main"),
+		State:                   String("active"),
+		SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/required_workflows/12345/repositories"),
+		CreatedAt:               &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)},
+		UpdatedAt:               &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)},
+		Repository:              &Repository{ID: Int64(53), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")},
+	}
+
+	if !cmp.Equal(requiredWokflow, want) {
+		t.Errorf("Actions.UpdateRequiredWorkflow returned %+v, want %+v", requiredWokflow, want)
+	}
+
+	const methodName = "UpdateRequiredWorkflow"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.UpdateRequiredWorkflow(ctx, "\n", 12345, input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.UpdateRequiredWorkflow(ctx, "o", 12345, input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_DeleteRequiredWorkflow(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows/12345", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+		w.WriteHeader(http.StatusNoContent)
+	})
+	ctx := context.Background()
+	_, err := client.Actions.DeleteRequiredWorkflow(ctx, "o", 12345)
+
+	if err != nil {
+		t.Errorf("Actions.DeleteRequiredWorkflow returned error: %v", err)
+	}
+
+	const methodName = "DeleteRequiredWorkflow"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.DeleteRequiredWorkflow(ctx, "\n", 12345)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.DeleteRequiredWorkflow(ctx, "o", 12345)
+	})
+}
+
+func TestActionsService_ListRequiredWorkflowSelectedRepos(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows/12345/repositories", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"per_page": "2", "page": "2"})
+		fmt.Fprint(w, `{"total_count":1,
+			"repositories": [{
+				"id": 1296269,
+				"url": "https://api.github.com/repos/o/Hello-World",
+				"name": "Hello-World"
+				}]
+		}`)
+	})
+	opts := &ListOptions{Page: 2, PerPage: 2}
+	ctx := context.Background()
+	jobs, _, err := client.Actions.ListRequiredWorkflowSelectedRepos(ctx, "o", 12345, opts)
+
+	if err != nil {
+		t.Errorf("Actions.ListRequiredWorkflowSelectedRepositories returned error: %v", err)
+	}
+
+	want := &RequiredWorkflowSelectedRepos{
+		TotalCount: Int(1),
+		Repositories: []*Repository{
+			{ID: Int64(1296269), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")},
+		},
+	}
+	if !cmp.Equal(jobs, want) {
+		t.Errorf("Actions.ListRequiredWorkflowSelectedRepositories returned %+v, want %+v", jobs, want)
+	}
+	const methodName = "ListRequiredWorkflowSelectedRepositories"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListRequiredWorkflowSelectedRepos(ctx, "\n", 12345, opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListRequiredWorkflowSelectedRepos(ctx, "o", 12345, opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_SetRequiredWorkflowSelectedRepos(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows/12345/repositories", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"selected_repository_ids":[32,91]}`+"\n")
+		w.WriteHeader(http.StatusNoContent)
+	})
+	ctx := context.Background()
+	_, err := client.Actions.SetRequiredWorkflowSelectedRepos(ctx, "o", 12345, SelectedRepoIDs{32, 91})
+
+	if err != nil {
+		t.Errorf("Actions.SetRequiredWorkflowSelectedRepositories returned error: %v", err)
+	}
+
+	const methodName = "SetRequiredWorkflowSelectedRepositories"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.SetRequiredWorkflowSelectedRepos(ctx, "\n", 12345, SelectedRepoIDs{32, 91})
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.SetRequiredWorkflowSelectedRepos(ctx, "o", 12345, SelectedRepoIDs{32, 91})
+	})
+}
+
+func TestActionsService_AddRepoToRequiredWorkflow(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows/12345/repositories/32", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		w.WriteHeader(http.StatusNoContent)
+	})
+	ctx := context.Background()
+	_, err := client.Actions.AddRepoToRequiredWorkflow(ctx, "o", 12345, 32)
+
+	if err != nil {
+		t.Errorf("Actions.AddRepoToRequiredWorkflow returned error: %v", err)
+	}
+
+	const methodName = "AddRepoToRequiredWorkflow"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.AddRepoToRequiredWorkflow(ctx, "\n", 12345, 32)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.AddRepoToRequiredWorkflow(ctx, "o", 12345, 32)
+	})
+}
+
+func TestActionsService_RemoveRepoFromRequiredWorkflow(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/orgs/o/actions/required_workflows/12345/repositories/32", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+		w.WriteHeader(http.StatusNoContent)
+	})
+	ctx := context.Background()
+	_, err := client.Actions.RemoveRepoFromRequiredWorkflow(ctx, "o", 12345, 32)
+
+	if err != nil {
+		t.Errorf("Actions.RemoveRepoFromRequiredWorkflow returned error: %v", err)
+	}
+
+	const methodName = "RemoveRepoFromRequiredWorkflow"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.RemoveRepoFromRequiredWorkflow(ctx, "\n", 12345, 32)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.RemoveRepoFromRequiredWorkflow(ctx, "o", 12345, 32)
+	})
+}
+
+func TestActionsService_ListRepoRequiredWorkflows(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/repos/o/r/actions/required_workflows", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"per_page": "2", "page": "2"})
+		fmt.Fprint(w, `{"total_count":1,"required_workflows": [
+			{
+			  "id": 30433642,
+			  "node_id": "MDg6V29ya2Zsb3cxNjEzMzU=",
+			  "name": "Required CI",
+			  "path": ".github/workflows/ci.yml",
+			  "state": "active",
+			  "created_at": "2020-01-22T19:33:08Z",
+			  "updated_at": "2020-01-22T19:33:08Z",
+			  "url": "https://api.github.com/repos/o/r/actions/required_workflows/161335",
+			  "html_url": "https://github.com/o/r/blob/master/o/hello-world/.github/workflows/required_ci.yaml",
+			  "badge_url": "https://github.com/o/r/workflows/required/o/hello-world/.github/workflows/required_ci.yaml/badge.svg",
+			  "source_repository":{
+				"id": 1296269,
+				"url": "https://api.github.com/repos/o/Hello-World",
+				"name": "Hello-World"
+			  }
+			}
+		  ]
+		}`)
+	})
+	opts := &ListOptions{Page: 2, PerPage: 2}
+	ctx := context.Background()
+	jobs, _, err := client.Actions.ListRepoRequiredWorkflows(ctx, "o", "r", opts)
+
+	if err != nil {
+		t.Errorf("Actions.ListRepoRequiredWorkflows returned error: %v", err)
+	}
+
+	want := &RepoRequiredWorkflows{
+		TotalCount: Int(1),
+		RequiredWorkflows: []*RepoRequiredWorkflow{
+			{ID: Int64(30433642), NodeID: String("MDg6V29ya2Zsb3cxNjEzMzU="), Name: String("Required CI"), Path: String(".github/workflows/ci.yml"), State: String("active"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, URL: String("https://api.github.com/repos/o/r/actions/required_workflows/161335"), BadgeURL: String("https://github.com/o/r/workflows/required/o/hello-world/.github/workflows/required_ci.yaml/badge.svg"), HTMLURL: String("https://github.com/o/r/blob/master/o/hello-world/.github/workflows/required_ci.yaml"), SourceRepository: &Repository{ID: Int64(1296269), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")}},
+		},
+	}
+	if !cmp.Equal(jobs, want) {
+		t.Errorf("Actions.ListRepoRequiredWorkflows returned %+v, want %+v", jobs, want)
+	}
+	const methodName = "ListRepoRequiredWorkflows"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListRepoRequiredWorkflows(ctx, "\n", "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListRepoRequiredWorkflows(ctx, "o", "r", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
diff --git a/github/actions_variables.go b/github/actions_variables.go
new file mode 100644
index 0000000..29445ed
--- /dev/null
+++ b/github/actions_variables.go
@@ -0,0 +1,293 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+)
+
+// ActionsVariable represents a repository action variable.
+type ActionsVariable struct {
+	Name       string     `json:"name"`
+	Value      string     `json:"value"`
+	CreatedAt  *Timestamp `json:"created_at,omitempty"`
+	UpdatedAt  *Timestamp `json:"updated_at,omitempty"`
+	Visibility *string    `json:"visibility,omitempty"`
+	// Used by ListOrgVariables and GetOrgVariables
+	SelectedRepositoriesURL *string `json:"selected_repositories_url,omitempty"`
+	// Used by UpdateOrgVariable and CreateOrgVariable
+	SelectedRepositoryIDs *SelectedRepoIDs `json:"selected_repository_ids,omitempty"`
+}
+
+// ActionsVariables represents one item from the ListVariables response.
+type ActionsVariables struct {
+	TotalCount int                `json:"total_count"`
+	Variables  []*ActionsVariable `json:"variables"`
+}
+
+func (s *ActionsService) listVariables(ctx context.Context, url string, opts *ListOptions) (*ActionsVariables, *Response, error) {
+	u, err := addOptions(url, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	variables := new(ActionsVariables)
+	resp, err := s.client.Do(ctx, req, &variables)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return variables, resp, nil
+}
+
+// ListRepoVariables lists all variables available in a repository.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#list-repository-variables
+func (s *ActionsService) ListRepoVariables(ctx context.Context, owner, repo string, opts *ListOptions) (*ActionsVariables, *Response, error) {
+	url := fmt.Sprintf("repos/%v/%v/actions/variables", owner, repo)
+	return s.listVariables(ctx, url, opts)
+}
+
+// ListOrgVariables lists all variables available in an organization.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#list-organization-variables
+func (s *ActionsService) ListOrgVariables(ctx context.Context, org string, opts *ListOptions) (*ActionsVariables, *Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables", org)
+	return s.listVariables(ctx, url, opts)
+}
+
+// ListEnvVariables lists all variables available in an environment.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#list-environment-variables
+func (s *ActionsService) ListEnvVariables(ctx context.Context, repoID int, env string, opts *ListOptions) (*ActionsVariables, *Response, error) {
+	url := fmt.Sprintf("repositories/%v/environments/%v/variables", repoID, env)
+	return s.listVariables(ctx, url, opts)
+}
+
+func (s *ActionsService) getVariable(ctx context.Context, url string) (*ActionsVariable, *Response, error) {
+	req, err := s.client.NewRequest("GET", url, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	variable := new(ActionsVariable)
+	resp, err := s.client.Do(ctx, req, variable)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return variable, resp, nil
+}
+
+// GetRepoVariable gets a single repository variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#get-a-repository-variable
+func (s *ActionsService) GetRepoVariable(ctx context.Context, owner, repo, name string) (*ActionsVariable, *Response, error) {
+	url := fmt.Sprintf("repos/%v/%v/actions/variables/%v", owner, repo, name)
+	return s.getVariable(ctx, url)
+}
+
+// GetOrgVariable gets a single organization variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#get-an-organization-variable
+func (s *ActionsService) GetOrgVariable(ctx context.Context, org, name string) (*ActionsVariable, *Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables/%v", org, name)
+	return s.getVariable(ctx, url)
+}
+
+// GetEnvVariable gets a single environment variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#get-an-environment-variable
+func (s *ActionsService) GetEnvVariable(ctx context.Context, repoID int, env, variableName string) (*ActionsVariable, *Response, error) {
+	url := fmt.Sprintf("repositories/%v/environments/%v/variables/%v", repoID, env, variableName)
+	return s.getVariable(ctx, url)
+}
+
+func (s *ActionsService) postVariable(ctx context.Context, url string, variable *ActionsVariable) (*Response, error) {
+	req, err := s.client.NewRequest("POST", url, variable)
+	if err != nil {
+		return nil, err
+	}
+	return s.client.Do(ctx, req, nil)
+}
+
+// CreateRepoVariable creates a repository variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#create-a-repository-variable
+func (s *ActionsService) CreateRepoVariable(ctx context.Context, owner, repo string, variable *ActionsVariable) (*Response, error) {
+	url := fmt.Sprintf("repos/%v/%v/actions/variables", owner, repo)
+	return s.postVariable(ctx, url, variable)
+}
+
+// CreateOrgVariable creates an organization variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#create-an-organization-variable
+func (s *ActionsService) CreateOrgVariable(ctx context.Context, org string, variable *ActionsVariable) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables", org)
+	return s.postVariable(ctx, url, variable)
+}
+
+// CreateEnvVariable creates an environment variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#create-an-environment-variable
+func (s *ActionsService) CreateEnvVariable(ctx context.Context, repoID int, env string, variable *ActionsVariable) (*Response, error) {
+	url := fmt.Sprintf("repositories/%v/environments/%v/variables", repoID, env)
+	return s.postVariable(ctx, url, variable)
+}
+
+func (s *ActionsService) patchVariable(ctx context.Context, url string, variable *ActionsVariable) (*Response, error) {
+	req, err := s.client.NewRequest("PATCH", url, variable)
+	if err != nil {
+		return nil, err
+	}
+	return s.client.Do(ctx, req, nil)
+}
+
+// UpdateRepoVariable updates a repository variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#update-a-repository-variable
+func (s *ActionsService) UpdateRepoVariable(ctx context.Context, owner, repo string, variable *ActionsVariable) (*Response, error) {
+	url := fmt.Sprintf("repos/%v/%v/actions/variables/%v", owner, repo, variable.Name)
+	return s.patchVariable(ctx, url, variable)
+}
+
+// UpdateOrgVariable updates an organization variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#update-an-organization-variable
+func (s *ActionsService) UpdateOrgVariable(ctx context.Context, org string, variable *ActionsVariable) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables/%v", org, variable.Name)
+	return s.patchVariable(ctx, url, variable)
+}
+
+// UpdateEnvVariable updates an environment variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#create-an-environment-variable
+func (s *ActionsService) UpdateEnvVariable(ctx context.Context, repoID int, env string, variable *ActionsVariable) (*Response, error) {
+	url := fmt.Sprintf("repositories/%v/environments/%v/variables/%v", repoID, env, variable.Name)
+	return s.patchVariable(ctx, url, variable)
+}
+
+func (s *ActionsService) deleteVariable(ctx context.Context, url string) (*Response, error) {
+	req, err := s.client.NewRequest("DELETE", url, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
+
+// DeleteRepoVariable deletes a variable in a repository.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#delete-a-repository-variable
+func (s *ActionsService) DeleteRepoVariable(ctx context.Context, owner, repo, name string) (*Response, error) {
+	url := fmt.Sprintf("repos/%v/%v/actions/variables/%v", owner, repo, name)
+	return s.deleteVariable(ctx, url)
+}
+
+// DeleteOrgVariable deletes a variable in an organization.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#delete-an-organization-variable
+func (s *ActionsService) DeleteOrgVariable(ctx context.Context, org, name string) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables/%v", org, name)
+	return s.deleteVariable(ctx, url)
+}
+
+// DeleteEnvVariable deletes a variable in an environment.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#delete-an-environment-variable
+func (s *ActionsService) DeleteEnvVariable(ctx context.Context, repoID int, env, variableName string) (*Response, error) {
+	url := fmt.Sprintf("repositories/%v/environments/%v/variables/%v", repoID, env, variableName)
+	return s.deleteVariable(ctx, url)
+}
+
+func (s *ActionsService) listSelectedReposForVariable(ctx context.Context, url string, opts *ListOptions) (*SelectedReposList, *Response, error) {
+	u, err := addOptions(url, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	result := new(SelectedReposList)
+	resp, err := s.client.Do(ctx, req, result)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return result, resp, nil
+}
+
+// ListSelectedReposForOrgVariable lists all repositories that have access to a variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#list-selected-repositories-for-an-organization-variable
+func (s *ActionsService) ListSelectedReposForOrgVariable(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories", org, name)
+	return s.listSelectedReposForVariable(ctx, url, opts)
+}
+
+func (s *ActionsService) setSelectedReposForVariable(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) {
+	type repoIDs struct {
+		SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"`
+	}
+
+	req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids})
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
+
+// SetSelectedReposForOrgVariable sets the repositories that have access to a variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#set-selected-repositories-for-an-organization-variable
+func (s *ActionsService) SetSelectedReposForOrgVariable(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories", org, name)
+	return s.setSelectedReposForVariable(ctx, url, ids)
+}
+
+func (s *ActionsService) addSelectedRepoToVariable(ctx context.Context, url string) (*Response, error) {
+	req, err := s.client.NewRequest("PUT", url, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
+
+// AddSelectedRepoToOrgVariable adds a repository to an organization variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#add-selected-repository-to-an-organization-variable
+func (s *ActionsService) AddSelectedRepoToOrgVariable(ctx context.Context, org, name string, repo *Repository) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories/%v", org, name, *repo.ID)
+	return s.addSelectedRepoToVariable(ctx, url)
+}
+
+func (s *ActionsService) removeSelectedRepoFromVariable(ctx context.Context, url string) (*Response, error) {
+	req, err := s.client.NewRequest("DELETE", url, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
+
+// RemoveSelectedRepoFromOrgVariable removes a repository from an organization variable.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/variables#remove-selected-repository-from-an-organization-variable
+func (s *ActionsService) RemoveSelectedRepoFromOrgVariable(ctx context.Context, org, name string, repo *Repository) (*Response, error) {
+	url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories/%v", org, name, *repo.ID)
+	return s.removeSelectedRepoFromVariable(ctx, url)
+}
diff --git a/github/actions_variables_test.go b/github/actions_variables_test.go
new file mode 100644
index 0000000..646da92
--- /dev/null
+++ b/github/actions_variables_test.go
@@ -0,0 +1,659 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"testing"
+	"time"
+
+	"github.com/google/go-cmp/cmp"
+)
+
+func TestActionsService_ListRepoVariables(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/variables", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"per_page": "2", "page": "2"})
+		fmt.Fprint(w, `{"total_count":4,"variables":[{"name":"A","value":"AA","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","value":"BB","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`)
+	})
+
+	opts := &ListOptions{Page: 2, PerPage: 2}
+	ctx := context.Background()
+	variables, _, err := client.Actions.ListRepoVariables(ctx, "o", "r", opts)
+	if err != nil {
+		t.Errorf("Actions.ListRepoVariables returned error: %v", err)
+	}
+
+	want := &ActionsVariables{
+		TotalCount: 4,
+		Variables: []*ActionsVariable{
+			{Name: "A", Value: "AA", CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}},
+			{Name: "B", Value: "BB", CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}},
+		},
+	}
+	if !cmp.Equal(variables, want) {
+		t.Errorf("Actions.ListRepoVariables returned %+v, want %+v", variables, want)
+	}
+
+	const methodName = "ListRepoVariables"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListRepoVariables(ctx, "\n", "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListRepoVariables(ctx, "o", "r", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_GetRepoVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{"name":"NAME","value":"VALUE","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`)
+	})
+
+	ctx := context.Background()
+	variable, _, err := client.Actions.GetRepoVariable(ctx, "o", "r", "NAME")
+	if err != nil {
+		t.Errorf("Actions.GetRepoVariable returned error: %v", err)
+	}
+
+	want := &ActionsVariable{
+		Name:      "NAME",
+		Value:     "VALUE",
+		CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)},
+		UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)},
+	}
+	if !cmp.Equal(variable, want) {
+		t.Errorf("Actions.GetRepoVariable returned %+v, want %+v", variable, want)
+	}
+
+	const methodName = "GetRepoVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetRepoVariable(ctx, "\n", "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetRepoVariable(ctx, "o", "r", "NAME")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_CreateRepoVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/variables", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "POST")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"name":"NAME","value":"VALUE"}`+"\n")
+		w.WriteHeader(http.StatusCreated)
+	})
+
+	input := &ActionsVariable{
+		Name:  "NAME",
+		Value: "VALUE",
+	}
+	ctx := context.Background()
+	_, err := client.Actions.CreateRepoVariable(ctx, "o", "r", input)
+	if err != nil {
+		t.Errorf("Actions.CreateRepoVariable returned error: %v", err)
+	}
+
+	const methodName = "CreateRepoVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.CreateRepoVariable(ctx, "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.CreateRepoVariable(ctx, "o", "r", input)
+	})
+}
+
+func TestActionsService_UpdateRepoVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PATCH")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"name":"NAME","value":"VALUE"}`+"\n")
+		w.WriteHeader(http.StatusNoContent)
+	})
+
+	input := &ActionsVariable{
+		Name:  "NAME",
+		Value: "VALUE",
+	}
+	ctx := context.Background()
+	_, err := client.Actions.UpdateRepoVariable(ctx, "o", "r", input)
+	if err != nil {
+		t.Errorf("Actions.UpdateRepoVariable returned error: %v", err)
+	}
+
+	const methodName = "UpdateRepoVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.UpdateRepoVariable(ctx, "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.UpdateRepoVariable(ctx, "o", "r", input)
+	})
+}
+
+func TestActionsService_DeleteRepoVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+	})
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteRepoVariable(ctx, "o", "r", "NAME")
+	if err != nil {
+		t.Errorf("Actions.( returned error: %v", err)
+	}
+
+	const methodName = "DeleteRepoVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.DeleteRepoVariable(ctx, "\n", "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.DeleteRepoVariable(ctx, "o", "r", "NAME")
+	})
+}
+
+func TestActionsService_ListOrgVariables(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"per_page": "2", "page": "2"})
+		fmt.Fprint(w, `{"total_count":3,"variables":[{"name":"A","value":"AA","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"private"},{"name":"B","value":"BB","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"all"},{"name":"C","value":"CC","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"selected","selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/variables/VAR/repositories"}]}`)
+	})
+
+	opts := &ListOptions{Page: 2, PerPage: 2}
+	ctx := context.Background()
+	variables, _, err := client.Actions.ListOrgVariables(ctx, "o", opts)
+	if err != nil {
+		t.Errorf("Actions.ListOrgVariables returned error: %v", err)
+	}
+
+	want := &ActionsVariables{
+		TotalCount: 3,
+		Variables: []*ActionsVariable{
+			{Name: "A", Value: "AA", CreatedAt: &Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: String("private")},
+			{Name: "B", Value: "BB", CreatedAt: &Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: String("all")},
+			{Name: "C", Value: "CC", CreatedAt: &Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: String("selected"), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/variables/VAR/repositories")},
+		},
+	}
+	if !cmp.Equal(variables, want) {
+		t.Errorf("Actions.ListOrgVariables returned %+v, want %+v", variables, want)
+	}
+
+	const methodName = "ListOrgVariables"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListOrgVariables(ctx, "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListOrgVariables(ctx, "o", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_GetOrgVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{"name":"NAME","value":"VALUE","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z","visibility":"selected","selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/variables/VAR/repositories"}`)
+	})
+
+	ctx := context.Background()
+	variable, _, err := client.Actions.GetOrgVariable(ctx, "o", "NAME")
+	if err != nil {
+		t.Errorf("Actions.GetOrgVariable returned error: %v", err)
+	}
+
+	want := &ActionsVariable{
+		Name:                    "NAME",
+		Value:                   "VALUE",
+		CreatedAt:               &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)},
+		UpdatedAt:               &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)},
+		Visibility:              String("selected"),
+		SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/variables/VAR/repositories"),
+	}
+	if !cmp.Equal(variable, want) {
+		t.Errorf("Actions.GetOrgVariable returned %+v, want %+v", variable, want)
+	}
+
+	const methodName = "GetOrgVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetOrgVariable(ctx, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetOrgVariable(ctx, "o", "NAME")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_CreateOrgVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "POST")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"name":"NAME","value":"VALUE","visibility":"selected","selected_repository_ids":[1296269,1269280]}`+"\n")
+		w.WriteHeader(http.StatusCreated)
+	})
+
+	input := &ActionsVariable{
+		Name:                  "NAME",
+		Value:                 "VALUE",
+		Visibility:            String("selected"),
+		SelectedRepositoryIDs: &SelectedRepoIDs{1296269, 1269280},
+	}
+	ctx := context.Background()
+	_, err := client.Actions.CreateOrgVariable(ctx, "o", input)
+	if err != nil {
+		t.Errorf("Actions.CreateOrgVariable returned error: %v", err)
+	}
+
+	const methodName = "CreateOrgVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.CreateOrgVariable(ctx, "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.CreateOrgVariable(ctx, "o", input)
+	})
+}
+
+func TestActionsService_UpdateOrgVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PATCH")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"name":"NAME","value":"VALUE","visibility":"selected","selected_repository_ids":[1296269,1269280]}`+"\n")
+		w.WriteHeader(http.StatusNoContent)
+	})
+
+	input := &ActionsVariable{
+		Name:                  "NAME",
+		Value:                 "VALUE",
+		Visibility:            String("selected"),
+		SelectedRepositoryIDs: &SelectedRepoIDs{1296269, 1269280},
+	}
+	ctx := context.Background()
+	_, err := client.Actions.UpdateOrgVariable(ctx, "o", input)
+	if err != nil {
+		t.Errorf("Actions.UpdateOrgVariable returned error: %v", err)
+	}
+
+	const methodName = "UpdateOrgVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.UpdateOrgVariable(ctx, "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.UpdateOrgVariable(ctx, "o", input)
+	})
+}
+
+func TestActionsService_ListSelectedReposForOrgVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables/NAME/repositories", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprintf(w, `{"total_count":1,"repositories":[{"id":1}]}`)
+	})
+
+	opts := &ListOptions{Page: 2, PerPage: 2}
+	ctx := context.Background()
+	repos, _, err := client.Actions.ListSelectedReposForOrgVariable(ctx, "o", "NAME", opts)
+	if err != nil {
+		t.Errorf("Actions.( returned error: %v", err)
+	}
+
+	want := &SelectedReposList{
+		TotalCount: Int(1),
+		Repositories: []*Repository{
+			{ID: Int64(1)},
+		},
+	}
+	if !cmp.Equal(repos, want) {
+		t.Errorf("Actions.( returned %+v, want %+v", repos, want)
+	}
+
+	const methodName = "ListSelectedReposForOrgVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListSelectedReposForOrgVariable(ctx, "\n", "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListSelectedReposForOrgVariable(ctx, "o", "NAME", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_SetSelectedReposForOrgSVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables/NAME/repositories", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"selected_repository_ids":[64780797]}`+"\n")
+	})
+
+	ctx := context.Background()
+	_, err := client.Actions.SetSelectedReposForOrgVariable(ctx, "o", "NAME", SelectedRepoIDs{64780797})
+	if err != nil {
+		t.Errorf("Actions.( returned error: %v", err)
+	}
+
+	const methodName = "SetSelectedReposForOrgVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.SetSelectedReposForOrgVariable(ctx, "\n", "\n", SelectedRepoIDs{64780797})
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.SetSelectedReposForOrgVariable(ctx, "o", "NAME", SelectedRepoIDs{64780797})
+	})
+}
+
+func TestActionsService_AddSelectedRepoToOrgVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+	})
+
+	repo := &Repository{ID: Int64(1234)}
+	ctx := context.Background()
+	_, err := client.Actions.AddSelectedRepoToOrgVariable(ctx, "o", "NAME", repo)
+	if err != nil {
+		t.Errorf("Actions.AddSelectedRepoToOrgVariable returned error: %v", err)
+	}
+
+	const methodName = "AddSelectedRepoToOrgVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.AddSelectedRepoToOrgVariable(ctx, "\n", "\n", repo)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.AddSelectedRepoToOrgVariable(ctx, "o", "NAME", repo)
+	})
+}
+
+func TestActionsService_RemoveSelectedRepoFromOrgVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+	})
+
+	repo := &Repository{ID: Int64(1234)}
+	ctx := context.Background()
+	_, err := client.Actions.RemoveSelectedRepoFromOrgVariable(ctx, "o", "NAME", repo)
+	if err != nil {
+		t.Errorf("Actions.RemoveSelectedRepoFromOrgVariable returned error: %v", err)
+	}
+
+	const methodName = "RemoveSelectedRepoFromOrgVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.RemoveSelectedRepoFromOrgVariable(ctx, "\n", "\n", repo)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.RemoveSelectedRepoFromOrgVariable(ctx, "o", "NAME", repo)
+	})
+}
+
+func TestActionsService_DeleteOrgVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+	})
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteOrgVariable(ctx, "o", "NAME")
+	if err != nil {
+		t.Errorf("Actions.DeleteOrgVariable returned error: %v", err)
+	}
+
+	const methodName = "DeleteOrgVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.DeleteOrgVariable(ctx, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.DeleteOrgVariable(ctx, "o", "NAME")
+	})
+}
+
+func TestActionsService_ListEnvVariables(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repositories/1/environments/e/variables", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"per_page": "2", "page": "2"})
+		fmt.Fprint(w, `{"total_count":4,"variables":[{"name":"A","value":"AA","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","value":"BB","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`)
+	})
+
+	opts := &ListOptions{Page: 2, PerPage: 2}
+	ctx := context.Background()
+	variables, _, err := client.Actions.ListEnvVariables(ctx, 1, "e", opts)
+	if err != nil {
+		t.Errorf("Actions.ListEnvVariables returned error: %v", err)
+	}
+
+	want := &ActionsVariables{
+		TotalCount: 4,
+		Variables: []*ActionsVariable{
+			{Name: "A", Value: "AA", CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}},
+			{Name: "B", Value: "BB", CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}},
+		},
+	}
+	if !cmp.Equal(variables, want) {
+		t.Errorf("Actions.ListEnvVariables returned %+v, want %+v", variables, want)
+	}
+
+	const methodName = "ListEnvVariables"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.ListEnvVariables(ctx, 0.0, "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.ListEnvVariables(ctx, 1, "e", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_GetEnvVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repositories/1/environments/e/variables/variable", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{"name":"variable","value":"VAR","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`)
+	})
+
+	ctx := context.Background()
+	variable, _, err := client.Actions.GetEnvVariable(ctx, 1, "e", "variable")
+	if err != nil {
+		t.Errorf("Actions.GetEnvVariable returned error: %v", err)
+	}
+
+	want := &ActionsVariable{
+		Name:      "variable",
+		Value:     "VAR",
+		CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)},
+		UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)},
+	}
+	if !cmp.Equal(variable, want) {
+		t.Errorf("Actions.GetEnvVariable returned %+v, want %+v", variable, want)
+	}
+
+	const methodName = "GetEnvVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetEnvVariable(ctx, 0.0, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Actions.GetEnvVariable(ctx, 1, "e", "variable")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestActionsService_CreateEnvVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repositories/1/environments/e/variables", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "POST")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"name":"variable","value":"VAR"}`+"\n")
+		w.WriteHeader(http.StatusCreated)
+	})
+
+	input := &ActionsVariable{
+		Name:  "variable",
+		Value: "VAR",
+	}
+	ctx := context.Background()
+	_, err := client.Actions.CreateEnvVariable(ctx, 1, "e", input)
+	if err != nil {
+		t.Errorf("Actions.CreateEnvVariable returned error: %v", err)
+	}
+
+	const methodName = "CreateEnvVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.CreateEnvVariable(ctx, 0.0, "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.CreateEnvVariable(ctx, 1, "e", input)
+	})
+}
+
+func TestActionsService_UpdateEnvVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repositories/1/environments/e/variables/variable", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PATCH")
+		testHeader(t, r, "Content-Type", "application/json")
+		testBody(t, r, `{"name":"variable","value":"VAR"}`+"\n")
+		w.WriteHeader(http.StatusNoContent)
+	})
+
+	input := &ActionsVariable{
+		Name:  "variable",
+		Value: "VAR",
+	}
+	ctx := context.Background()
+	_, err := client.Actions.UpdateEnvVariable(ctx, 1, "e", input)
+	if err != nil {
+		t.Errorf("Actions.UpdateEnvVariable returned error: %v", err)
+	}
+
+	const methodName = "UpdateEnvVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.UpdateEnvVariable(ctx, 0.0, "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.UpdateEnvVariable(ctx, 1, "e", input)
+	})
+}
+
+func TestActionsService_DeleteEnvVariable(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repositories/1/environments/e/variables/variable", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+	})
+
+	ctx := context.Background()
+	_, err := client.Actions.DeleteEnvVariable(ctx, 1, "e", "variable")
+	if err != nil {
+		t.Errorf("Actions.DeleteEnvVariable returned error: %v", err)
+	}
+
+	const methodName = "DeleteEnvVariable"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Actions.DeleteEnvVariable(ctx, 0.0, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Actions.DeleteEnvVariable(ctx, 1, "r", "variable")
+	})
+}
diff --git a/github/actions_workflow_jobs.go b/github/actions_workflow_jobs.go
index 2867e82..1f018b3 100644
--- a/github/actions_workflow_jobs.go
+++ b/github/actions_workflow_jobs.go
@@ -28,11 +28,13 @@ type WorkflowJob struct {
 	RunID       *int64      `json:"run_id,omitempty"`
 	RunURL      *string     `json:"run_url,omitempty"`
 	NodeID      *string     `json:"node_id,omitempty"`
+	HeadBranch  *string     `json:"head_branch,omitempty"`
 	HeadSHA     *string     `json:"head_sha,omitempty"`
 	URL         *string     `json:"url,omitempty"`
 	HTMLURL     *string     `json:"html_url,omitempty"`
 	Status      *string     `json:"status,omitempty"`
 	Conclusion  *string     `json:"conclusion,omitempty"`
+	CreatedAt   *Timestamp  `json:"created_at,omitempty"`
 	StartedAt   *Timestamp  `json:"started_at,omitempty"`
 	CompletedAt *Timestamp  `json:"completed_at,omitempty"`
 	Name        *string     `json:"name,omitempty"`
@@ -44,6 +46,8 @@ type WorkflowJob struct {
 	RunnerName      *string  `json:"runner_name,omitempty"`
 	RunnerGroupID   *int64   `json:"runner_group_id,omitempty"`
 	RunnerGroupName *string  `json:"runner_group_name,omitempty"`
+	RunAttempt      *int64   `json:"run_attempt,omitempty"`
+	WorkflowName    *string  `json:"workflow_name,omitempty"`
 }
 
 // Jobs represents a slice of repository action workflow job.
diff --git a/github/actions_workflow_jobs_test.go b/github/actions_workflow_jobs_test.go
index 49315a0..8cea954 100644
--- a/github/actions_workflow_jobs_test.go
+++ b/github/actions_workflow_jobs_test.go
@@ -246,11 +246,13 @@ func TestWorkflowJob_Marshal(t *testing.T) {
 		RunID:       Int64(1),
 		RunURL:      String("r"),
 		NodeID:      String("n"),
+		HeadBranch:  String("b"),
 		HeadSHA:     String("h"),
 		URL:         String("u"),
 		HTMLURL:     String("h"),
 		Status:      String("s"),
 		Conclusion:  String("c"),
+		CreatedAt:   &Timestamp{referenceTime},
 		StartedAt:   &Timestamp{referenceTime},
 		CompletedAt: &Timestamp{referenceTime},
 		Name:        String("n"),
@@ -264,7 +266,8 @@ func TestWorkflowJob_Marshal(t *testing.T) {
 				CompletedAt: &Timestamp{referenceTime},
 			},
 		},
-		CheckRunURL: String("c"),
+		CheckRunURL:  String("c"),
+		WorkflowName: String("w"),
 	}
 
 	want := `{
@@ -272,11 +275,13 @@ func TestWorkflowJob_Marshal(t *testing.T) {
 		"run_id": 1,
 		"run_url": "r",
 		"node_id": "n",
+		"head_branch": "b",
 		"head_sha": "h",
 		"url": "u",
 		"html_url": "h",
 		"status": "s",
 		"conclusion": "c",
+		"created_at": ` + referenceTimeStr + `,
 		"started_at": ` + referenceTimeStr + `,
 		"completed_at": ` + referenceTimeStr + `,
 		"name": "n",
@@ -288,7 +293,8 @@ func TestWorkflowJob_Marshal(t *testing.T) {
 			"started_at": ` + referenceTimeStr + `,
 			"completed_at": ` + referenceTimeStr + `
 		}],
-		"check_run_url": "c"
+		"check_run_url": "c",
+		"workflow_name": "w"
 	}`
 
 	testJSONMarshal(t, u, want)
@@ -305,11 +311,13 @@ func TestJobs_Marshal(t *testing.T) {
 				RunID:       Int64(1),
 				RunURL:      String("r"),
 				NodeID:      String("n"),
+				HeadBranch:  String("b"),
 				HeadSHA:     String("h"),
 				URL:         String("u"),
 				HTMLURL:     String("h"),
 				Status:      String("s"),
 				Conclusion:  String("c"),
+				CreatedAt:   &Timestamp{referenceTime},
 				StartedAt:   &Timestamp{referenceTime},
 				CompletedAt: &Timestamp{referenceTime},
 				Name:        String("n"),
@@ -323,7 +331,9 @@ func TestJobs_Marshal(t *testing.T) {
 						CompletedAt: &Timestamp{referenceTime},
 					},
 				},
-				CheckRunURL: String("c"),
+				CheckRunURL:  String("c"),
+				RunAttempt:   Int64(2),
+				WorkflowName: String("w"),
 			},
 		},
 	}
@@ -335,11 +345,13 @@ func TestJobs_Marshal(t *testing.T) {
 			"run_id": 1,
 			"run_url": "r",
 			"node_id": "n",
+			"head_branch": "b",
 			"head_sha": "h",
 			"url": "u",
 			"html_url": "h",
 			"status": "s",
 			"conclusion": "c",
+			"created_at": ` + referenceTimeStr + `,
 			"started_at": ` + referenceTimeStr + `,
 			"completed_at": ` + referenceTimeStr + `,
 			"name": "n",
@@ -351,7 +363,9 @@ func TestJobs_Marshal(t *testing.T) {
 				"started_at": ` + referenceTimeStr + `,
 				"completed_at": ` + referenceTimeStr + `
 			}],
-			"check_run_url": "c"
+			"check_run_url": "c",
+			"run_attempt": 2,
+			"workflow_name": "w"
 		}]
 	}`
 
diff --git a/github/actions_workflow_runs.go b/github/actions_workflow_runs.go
index 9fd01c4..7040487 100644
--- a/github/actions_workflow_runs.go
+++ b/github/actions_workflow_runs.go
@@ -55,26 +55,26 @@ type WorkflowRuns struct {
 
 // ListWorkflowRunsOptions specifies optional parameters to ListWorkflowRuns.
 type ListWorkflowRunsOptions struct {
-	Actor   string `url:"actor,omitempty"`
-	Branch  string `url:"branch,omitempty"`
-	Event   string `url:"event,omitempty"`
-	Status  string `url:"status,omitempty"`
-	Created string `url:"created,omitempty"`
+	Actor               string `url:"actor,omitempty"`
+	Branch              string `url:"branch,omitempty"`
+	Event               string `url:"event,omitempty"`
+	Status              string `url:"status,omitempty"`
+	Created             string `url:"created,omitempty"`
+	HeadSHA             string `url:"head_sha,omitempty"`
+	ExcludePullRequests bool   `url:"exclude_pull_requests,omitempty"`
+	CheckSuiteID        int64  `url:"check_suite_id,omitempty"`
 	ListOptions
 }
 
 // WorkflowRunUsage represents a usage of a specific workflow run.
 type WorkflowRunUsage struct {
-	Billable      *WorkflowRunEnvironment `json:"billable,omitempty"`
-	RunDurationMS *int64                  `json:"run_duration_ms,omitempty"`
+	Billable      *WorkflowRunBillMap `json:"billable,omitempty"`
+	RunDurationMS *int64              `json:"run_duration_ms,omitempty"`
 }
 
-// WorkflowRunEnvironment represents different runner environments available for a workflow run.
-type WorkflowRunEnvironment struct {
-	Ubuntu  *WorkflowRunBill `json:"UBUNTU,omitempty"`
-	MacOS   *WorkflowRunBill `json:"MACOS,omitempty"`
-	Windows *WorkflowRunBill `json:"WINDOWS,omitempty"`
-}
+// WorkflowRunBillMap represents different runner environments available for a workflow run.
+// Its key is the name of its environment, e.g. "UBUNTU", "MACOS", "WINDOWS", etc.
+type WorkflowRunBillMap map[string]*WorkflowRunBill
 
 // WorkflowRunBill specifies billable time for a specific environment in a workflow run.
 type WorkflowRunBill struct {
@@ -206,6 +206,26 @@ func (s *ActionsService) GetWorkflowRunAttempt(ctx context.Context, owner, repo
 	return run, resp, nil
 }
 
+// GetWorkflowRunAttemptLogs gets a redirect URL to download a plain text file of logs for a workflow run for attempt number.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/workflow-runs#download-workflow-run-attempt-logs
+func (s *ActionsService) GetWorkflowRunAttemptLogs(ctx context.Context, owner, repo string, runID int64, attemptNumber int, followRedirects bool) (*url.URL, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/attempts/%v/logs", owner, repo, runID, attemptNumber)
+
+	resp, err := s.client.roundTripWithOptionalFollowRedirect(ctx, u, followRedirects)
+	if err != nil {
+		return nil, nil, err
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode != http.StatusFound {
+		return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status)
+	}
+
+	parsedURL, err := url.Parse(resp.Header.Get("Location"))
+	return parsedURL, newResponse(resp), err
+}
+
 // RerunWorkflowByID re-runs a workflow by ID.
 //
 // GitHub API docs: https://docs.github.com/en/rest/actions/workflow-runs#re-run-a-workflow
diff --git a/github/actions_workflow_runs_test.go b/github/actions_workflow_runs_test.go
index 2705363..74b5bdd 100644
--- a/github/actions_workflow_runs_test.go
+++ b/github/actions_workflow_runs_test.go
@@ -188,6 +188,89 @@ func TestActionsService_GetWorkflowRunAttempt(t *testing.T) {
 	})
 }
 
+func TestActionsService_GetWorkflowRunAttemptLogs(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/runs/399444496/attempts/2/logs", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		http.Redirect(w, r, "http://github.com/a", http.StatusFound)
+	})
+
+	ctx := context.Background()
+	url, resp, err := client.Actions.GetWorkflowRunAttemptLogs(ctx, "o", "r", 399444496, 2, true)
+	if err != nil {
+		t.Errorf("Actions.GetWorkflowRunAttemptLogs returned error: %v", err)
+	}
+	if resp.StatusCode != http.StatusFound {
+		t.Errorf("Actions.GetWorkflowRunAttemptLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound)
+	}
+	want := "http://github.com/a"
+	if url.String() != want {
+		t.Errorf("Actions.GetWorkflowRunAttemptLogs returned %+v, want %+v", url.String(), want)
+	}
+
+	const methodName = "GetWorkflowRunAttemptLogs"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetWorkflowRunAttemptLogs(ctx, "\n", "\n", 399444496, 2, true)
+		return err
+	})
+}
+
+func TestActionsService_GetWorkflowRunAttemptLogs_StatusMovedPermanently_dontFollowRedirects(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/runs/399444496/attempts/2/logs", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		http.Redirect(w, r, "http://github.com/a", http.StatusMovedPermanently)
+	})
+
+	ctx := context.Background()
+	_, resp, _ := client.Actions.GetWorkflowRunAttemptLogs(ctx, "o", "r", 399444496, 2, false)
+	if resp.StatusCode != http.StatusMovedPermanently {
+		t.Errorf("Actions.GetWorkflowRunAttemptLogs returned status: %d, want %d", resp.StatusCode, http.StatusMovedPermanently)
+	}
+}
+
+func TestActionsService_GetWorkflowRunAttemptLogs_StatusMovedPermanently_followRedirects(t *testing.T) {
+	client, mux, serverURL, teardown := setup()
+	defer teardown()
+
+	// Mock a redirect link, which leads to an archive link
+	mux.HandleFunc("/repos/o/r/actions/runs/399444496/attempts/2/logs", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		redirectURL, _ := url.Parse(serverURL + baseURLPath + "/redirect")
+		http.Redirect(w, r, redirectURL.String(), http.StatusMovedPermanently)
+	})
+
+	mux.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		http.Redirect(w, r, "http://github.com/a", http.StatusFound)
+	})
+
+	ctx := context.Background()
+	url, resp, err := client.Actions.GetWorkflowRunAttemptLogs(ctx, "o", "r", 399444496, 2, true)
+	if err != nil {
+		t.Errorf("Actions.GetWorkflowRunAttemptLogs returned error: %v", err)
+	}
+
+	if resp.StatusCode != http.StatusFound {
+		t.Errorf("Actions.GetWorkflowRunAttemptLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound)
+	}
+
+	want := "http://github.com/a"
+	if url.String() != want {
+		t.Errorf("Actions.GetWorkflowRunAttemptLogs returned %+v, want %+v", url.String(), want)
+	}
+
+	const methodName = "GetWorkflowRunAttemptLogs"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Actions.GetWorkflowRunAttemptLogs(ctx, "\n", "\n", 399444496, 2, true)
+		return err
+	})
+}
+
 func TestActionsService_RerunWorkflowRunByID(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
@@ -403,7 +486,6 @@ func TestActionService_ListRepositoryWorkflowRuns(t *testing.T) {
 	opts := &ListWorkflowRunsOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}}
 	ctx := context.Background()
 	runs, _, err := client.Actions.ListRepositoryWorkflowRuns(ctx, "o", "r", opts)
-
 	if err != nil {
 		t.Errorf("Actions.ListRepositoryWorkflowRuns returned error: %v", err)
 	}
@@ -505,8 +587,8 @@ func TestActionsService_GetWorkflowRunUsageByID(t *testing.T) {
 	}
 
 	want := &WorkflowRunUsage{
-		Billable: &WorkflowRunEnvironment{
-			Ubuntu: &WorkflowRunBill{
+		Billable: &WorkflowRunBillMap{
+			"UBUNTU": &WorkflowRunBill{
 				TotalMS: Int64(180000),
 				Jobs:    Int(1),
 				JobRuns: []*WorkflowRunJobRun{
@@ -516,7 +598,7 @@ func TestActionsService_GetWorkflowRunUsageByID(t *testing.T) {
 					},
 				},
 			},
-			MacOS: &WorkflowRunBill{
+			"MACOS": &WorkflowRunBill{
 				TotalMS: Int64(240000),
 				Jobs:    Int(2),
 				JobRuns: []*WorkflowRunJobRun{
@@ -530,7 +612,7 @@ func TestActionsService_GetWorkflowRunUsageByID(t *testing.T) {
 					},
 				},
 			},
-			Windows: &WorkflowRunBill{
+			"WINDOWS": &WorkflowRunBill{
 				TotalMS: Int64(300000),
 				Jobs:    Int(2),
 			},
@@ -975,7 +1057,7 @@ func TestWorkflowRuns_Marshal(t *testing.T) {
 					"created_at": ` + referenceTimeStr + `,
 					"suspended_at": ` + referenceTimeStr + `,
 					"url": "u"
-				}		
+				}
 			}
 		]
 	}`
@@ -999,19 +1081,19 @@ func TestWorkflowRunBill_Marshal(t *testing.T) {
 	testJSONMarshal(t, u, want)
 }
 
-func TestWorkflowRunEnvironment_Marshal(t *testing.T) {
-	testJSONMarshal(t, &WorkflowRunEnvironment{}, "{}")
+func TestWorkflowRunBillMap_Marshal(t *testing.T) {
+	testJSONMarshal(t, &WorkflowRunBillMap{}, "{}")
 
-	u := &WorkflowRunEnvironment{
-		Ubuntu: &WorkflowRunBill{
+	u := &WorkflowRunBillMap{
+		"UBUNTU": &WorkflowRunBill{
 			TotalMS: Int64(1),
 			Jobs:    Int(1),
 		},
-		MacOS: &WorkflowRunBill{
+		"MACOS": &WorkflowRunBill{
 			TotalMS: Int64(1),
 			Jobs:    Int(1),
 		},
-		Windows: &WorkflowRunBill{
+		"WINDOWS": &WorkflowRunBill{
 			TotalMS: Int64(1),
 			Jobs:    Int(1),
 		},
@@ -1039,16 +1121,16 @@ func TestWorkflowRunUsage_Marshal(t *testing.T) {
 	testJSONMarshal(t, &WorkflowRunUsage{}, "{}")
 
 	u := &WorkflowRunUsage{
-		Billable: &WorkflowRunEnvironment{
-			Ubuntu: &WorkflowRunBill{
+		Billable: &WorkflowRunBillMap{
+			"UBUNTU": &WorkflowRunBill{
 				TotalMS: Int64(1),
 				Jobs:    Int(1),
 			},
-			MacOS: &WorkflowRunBill{
+			"MACOS": &WorkflowRunBill{
 				TotalMS: Int64(1),
 				Jobs:    Int(1),
 			},
-			Windows: &WorkflowRunBill{
+			"WINDOWS": &WorkflowRunBill{
 				TotalMS: Int64(1),
 				Jobs:    Int(1),
 			},
diff --git a/github/actions_workflows.go b/github/actions_workflows.go
index 9973a5d..c9b47ed 100644
--- a/github/actions_workflows.go
+++ b/github/actions_workflows.go
@@ -32,15 +32,12 @@ type Workflows struct {
 
 // WorkflowUsage represents a usage of a specific workflow.
 type WorkflowUsage struct {
-	Billable *WorkflowEnvironment `json:"billable,omitempty"`
+	Billable *WorkflowBillMap `json:"billable,omitempty"`
 }
 
-// WorkflowEnvironment represents different runner environments available for a workflow.
-type WorkflowEnvironment struct {
-	Ubuntu  *WorkflowBill `json:"UBUNTU,omitempty"`
-	MacOS   *WorkflowBill `json:"MACOS,omitempty"`
-	Windows *WorkflowBill `json:"WINDOWS,omitempty"`
-}
+// WorkflowBillMap represents different runner environments available for a workflow.
+// Its key is the name of its environment, e.g. "UBUNTU", "MACOS", "WINDOWS", etc.
+type WorkflowBillMap map[string]*WorkflowBill
 
 // WorkflowBill specifies billable time for a specific environment in a workflow.
 type WorkflowBill struct {
diff --git a/github/actions_workflows_test.go b/github/actions_workflows_test.go
index 60a9d91..5e0dbbc 100644
--- a/github/actions_workflows_test.go
+++ b/github/actions_workflows_test.go
@@ -153,14 +153,14 @@ func TestActionsService_GetWorkflowUsageByID(t *testing.T) {
 	}
 
 	want := &WorkflowUsage{
-		Billable: &WorkflowEnvironment{
-			Ubuntu: &WorkflowBill{
+		Billable: &WorkflowBillMap{
+			"UBUNTU": &WorkflowBill{
 				TotalMS: Int64(180000),
 			},
-			MacOS: &WorkflowBill{
+			"MACOS": &WorkflowBill{
 				TotalMS: Int64(240000),
 			},
-			Windows: &WorkflowBill{
+			"WINDOWS": &WorkflowBill{
 				TotalMS: Int64(300000),
 			},
 		},
@@ -200,14 +200,14 @@ func TestActionsService_GetWorkflowUsageByFileName(t *testing.T) {
 	}
 
 	want := &WorkflowUsage{
-		Billable: &WorkflowEnvironment{
-			Ubuntu: &WorkflowBill{
+		Billable: &WorkflowBillMap{
+			"UBUNTU": &WorkflowBill{
 				TotalMS: Int64(180000),
 			},
-			MacOS: &WorkflowBill{
+			"MACOS": &WorkflowBill{
 				TotalMS: Int64(240000),
 			},
-			Windows: &WorkflowBill{
+			"WINDOWS": &WorkflowBill{
 				TotalMS: Int64(300000),
 			},
 		},
@@ -545,17 +545,17 @@ func TestWorkflowBill_Marshal(t *testing.T) {
 	testJSONMarshal(t, u, want)
 }
 
-func TestWorkflowEnvironment_Marshal(t *testing.T) {
-	testJSONMarshal(t, &WorkflowEnvironment{}, "{}")
+func TestWorkflowBillMap_Marshal(t *testing.T) {
+	testJSONMarshal(t, &WorkflowBillMap{}, "{}")
 
-	u := &WorkflowEnvironment{
-		Ubuntu: &WorkflowBill{
+	u := &WorkflowBillMap{
+		"UBUNTU": &WorkflowBill{
 			TotalMS: Int64(1),
 		},
-		MacOS: &WorkflowBill{
+		"MACOS": &WorkflowBill{
 			TotalMS: Int64(1),
 		},
-		Windows: &WorkflowBill{
+		"WINDOWS": &WorkflowBill{
 			TotalMS: Int64(1),
 		},
 	}
@@ -579,14 +579,14 @@ func TestWorkflowUsage_Marshal(t *testing.T) {
 	testJSONMarshal(t, &WorkflowUsage{}, "{}")
 
 	u := &WorkflowUsage{
-		Billable: &WorkflowEnvironment{
-			Ubuntu: &WorkflowBill{
+		Billable: &WorkflowBillMap{
+			"UBUNTU": &WorkflowBill{
 				TotalMS: Int64(1),
 			},
-			MacOS: &WorkflowBill{
+			"MACOS": &WorkflowBill{
 				TotalMS: Int64(1),
 			},
-			Windows: &WorkflowBill{
+			"WINDOWS": &WorkflowBill{
 				TotalMS: Int64(1),
 			},
 		},
diff --git a/github/activity_notifications.go b/github/activity_notifications.go
index 38a3184..03476c2 100644
--- a/github/activity_notifications.go
+++ b/github/activity_notifications.go
@@ -23,8 +23,8 @@ type Notification struct {
 	Reason *string `json:"reason,omitempty"`
 
 	Unread     *bool      `json:"unread,omitempty"`
-	UpdatedAt  *time.Time `json:"updated_at,omitempty"`
-	LastReadAt *time.Time `json:"last_read_at,omitempty"`
+	UpdatedAt  *Timestamp `json:"updated_at,omitempty"`
+	LastReadAt *Timestamp `json:"last_read_at,omitempty"`
 	URL        *string    `json:"url,omitempty"`
 }
 
@@ -97,13 +97,13 @@ func (s *ActivityService) ListRepositoryNotifications(ctx context.Context, owner
 }
 
 type markReadOptions struct {
-	LastReadAt time.Time `json:"last_read_at,omitempty"`
+	LastReadAt Timestamp `json:"last_read_at,omitempty"`
 }
 
 // MarkNotificationsRead marks all notifications up to lastRead as read.
 //
 // GitHub API docs: https://docs.github.com/en/rest/activity#mark-as-read
-func (s *ActivityService) MarkNotificationsRead(ctx context.Context, lastRead time.Time) (*Response, error) {
+func (s *ActivityService) MarkNotificationsRead(ctx context.Context, lastRead Timestamp) (*Response, error) {
 	opts := &markReadOptions{
 		LastReadAt: lastRead,
 	}
@@ -119,7 +119,7 @@ func (s *ActivityService) MarkNotificationsRead(ctx context.Context, lastRead ti
 // the specified repository as read.
 //
 // GitHub API docs: https://docs.github.com/en/rest/activity/notifications#mark-repository-notifications-as-read
-func (s *ActivityService) MarkRepositoryNotificationsRead(ctx context.Context, owner, repo string, lastRead time.Time) (*Response, error) {
+func (s *ActivityService) MarkRepositoryNotificationsRead(ctx context.Context, owner, repo string, lastRead Timestamp) (*Response, error) {
 	opts := &markReadOptions{
 		LastReadAt: lastRead,
 	}
diff --git a/github/activity_notifications_test.go b/github/activity_notifications_test.go
index fcd1cc3..830c8b1 100644
--- a/github/activity_notifications_test.go
+++ b/github/activity_notifications_test.go
@@ -107,14 +107,14 @@ func TestActivityService_MarkNotificationsRead(t *testing.T) {
 	})
 
 	ctx := context.Background()
-	_, err := client.Activity.MarkNotificationsRead(ctx, time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC))
+	_, err := client.Activity.MarkNotificationsRead(ctx, Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)})
 	if err != nil {
 		t.Errorf("Activity.MarkNotificationsRead returned error: %v", err)
 	}
 
 	const methodName = "MarkNotificationsRead"
 	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
-		return client.Activity.MarkNotificationsRead(ctx, time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC))
+		return client.Activity.MarkNotificationsRead(ctx, Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)})
 	})
 }
 
@@ -131,19 +131,19 @@ func TestActivityService_MarkRepositoryNotificationsRead(t *testing.T) {
 	})
 
 	ctx := context.Background()
-	_, err := client.Activity.MarkRepositoryNotificationsRead(ctx, "o", "r", time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC))
+	_, err := client.Activity.MarkRepositoryNotificationsRead(ctx, "o", "r", Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)})
 	if err != nil {
 		t.Errorf("Activity.MarkRepositoryNotificationsRead returned error: %v", err)
 	}
 
 	const methodName = "MarkRepositoryNotificationsRead"
 	testBadOptions(t, methodName, func() (err error) {
-		_, err = client.Activity.MarkRepositoryNotificationsRead(ctx, "\n", "\n", time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC))
+		_, err = client.Activity.MarkRepositoryNotificationsRead(ctx, "\n", "\n", Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)})
 		return err
 	})
 
 	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
-		return client.Activity.MarkRepositoryNotificationsRead(ctx, "o", "r", time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC))
+		return client.Activity.MarkRepositoryNotificationsRead(ctx, "o", "r", Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)})
 	})
 }
 
@@ -331,8 +331,8 @@ func TestNotification_Marshal(t *testing.T) {
 		},
 		Reason:     String("r"),
 		Unread:     Bool(true),
-		UpdatedAt:  &referenceTime,
-		LastReadAt: &referenceTime,
+		UpdatedAt:  &Timestamp{referenceTime},
+		LastReadAt: &Timestamp{referenceTime},
 		URL:        String("u"),
 	}
 
@@ -383,7 +383,7 @@ func TestMarkReadOptions_Marshal(t *testing.T) {
 	testJSONMarshal(t, &markReadOptions{}, "{}")
 
 	u := &markReadOptions{
-		LastReadAt: referenceTime,
+		LastReadAt: Timestamp{referenceTime},
 	}
 
 	want := `{
diff --git a/github/apps.go b/github/apps.go
index 98d8a6f..ab83d59 100644
--- a/github/apps.go
+++ b/github/apps.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // AppsService provides access to the installation related functions
@@ -19,24 +18,25 @@ type AppsService service
 
 // App represents a GitHub App.
 type App struct {
-	ID          *int64                   `json:"id,omitempty"`
-	Slug        *string                  `json:"slug,omitempty"`
-	NodeID      *string                  `json:"node_id,omitempty"`
-	Owner       *User                    `json:"owner,omitempty"`
-	Name        *string                  `json:"name,omitempty"`
-	Description *string                  `json:"description,omitempty"`
-	ExternalURL *string                  `json:"external_url,omitempty"`
-	HTMLURL     *string                  `json:"html_url,omitempty"`
-	CreatedAt   *Timestamp               `json:"created_at,omitempty"`
-	UpdatedAt   *Timestamp               `json:"updated_at,omitempty"`
-	Permissions *InstallationPermissions `json:"permissions,omitempty"`
-	Events      []string                 `json:"events,omitempty"`
+	ID                 *int64                   `json:"id,omitempty"`
+	Slug               *string                  `json:"slug,omitempty"`
+	NodeID             *string                  `json:"node_id,omitempty"`
+	Owner              *User                    `json:"owner,omitempty"`
+	Name               *string                  `json:"name,omitempty"`
+	Description        *string                  `json:"description,omitempty"`
+	ExternalURL        *string                  `json:"external_url,omitempty"`
+	HTMLURL            *string                  `json:"html_url,omitempty"`
+	CreatedAt          *Timestamp               `json:"created_at,omitempty"`
+	UpdatedAt          *Timestamp               `json:"updated_at,omitempty"`
+	Permissions        *InstallationPermissions `json:"permissions,omitempty"`
+	Events             []string                 `json:"events,omitempty"`
+	InstallationsCount *int                     `json:"installations_count,omitempty"`
 }
 
 // InstallationToken represents an installation token.
 type InstallationToken struct {
 	Token        *string                  `json:"token,omitempty"`
-	ExpiresAt    *time.Time               `json:"expires_at,omitempty"`
+	ExpiresAt    *Timestamp               `json:"expires_at,omitempty"`
 	Permissions  *InstallationPermissions `json:"permissions,omitempty"`
 	Repositories []*Repository            `json:"repositories,omitempty"`
 }
diff --git a/github/apps_marketplace.go b/github/apps_marketplace.go
index 8253013..32889ab 100644
--- a/github/apps_marketplace.go
+++ b/github/apps_marketplace.go
@@ -46,6 +46,7 @@ type MarketplacePlan struct {
 
 // MarketplacePurchase represents a GitHub Apps Marketplace Purchase.
 type MarketplacePurchase struct {
+	Account *MarketplacePurchaseAccount `json:"account,omitempty"`
 	// BillingCycle can be one of the values "yearly", "monthly" or nil.
 	BillingCycle    *string          `json:"billing_cycle,omitempty"`
 	NextBillingDate *Timestamp       `json:"next_billing_date,omitempty"`
@@ -75,6 +76,17 @@ type MarketplacePlanAccount struct {
 	MarketplacePendingChange *MarketplacePendingChange `json:"marketplace_pending_change,omitempty"`
 }
 
+// MarketplacePurchaseAccount represents a GitHub Account (user or organization) for a Purchase.
+type MarketplacePurchaseAccount struct {
+	URL                      *string `json:"url,omitempty"`
+	Type                     *string `json:"type,omitempty"`
+	ID                       *int64  `json:"id,omitempty"`
+	Login                    *string `json:"login,omitempty"`
+	OrganizationBillingEmail *string `json:"organization_billing_email,omitempty"`
+	Email                    *string `json:"email,omitempty"`
+	NodeID                   *string `json:"node_id,omitempty"`
+}
+
 // ListPlans lists all plans for your Marketplace listing.
 //
 // GitHub API docs: https://docs.github.com/en/rest/apps#list-plans
diff --git a/github/apps_test.go b/github/apps_test.go
index 494f103..d3e7c43 100644
--- a/github/apps_test.go
+++ b/github/apps_test.go
@@ -997,7 +997,7 @@ func TestInstallationToken_Marshal(t *testing.T) {
 
 	u := &InstallationToken{
 		Token:     String("t"),
-		ExpiresAt: &referenceTime,
+		ExpiresAt: &Timestamp{referenceTime},
 		Permissions: &InstallationPermissions{
 			Actions:                       String("a"),
 			Administration:                String("ad"),
diff --git a/github/billing.go b/github/billing.go
index d516cd0..7a76bf8 100644
--- a/github/billing.go
+++ b/github/billing.go
@@ -18,30 +18,27 @@ type BillingService service
 
 // ActionBilling represents a GitHub Action billing.
 type ActionBilling struct {
-	TotalMinutesUsed     int                  `json:"total_minutes_used"`
+	TotalMinutesUsed     float64              `json:"total_minutes_used"`
 	TotalPaidMinutesUsed float64              `json:"total_paid_minutes_used"`
-	IncludedMinutes      int                  `json:"included_minutes"`
+	IncludedMinutes      float64              `json:"included_minutes"`
 	MinutesUsedBreakdown MinutesUsedBreakdown `json:"minutes_used_breakdown"`
 }
 
-type MinutesUsedBreakdown struct {
-	Ubuntu  int `json:"UBUNTU"`
-	MacOS   int `json:"MACOS"`
-	Windows int `json:"WINDOWS"`
-}
+// MinutesUsedBreakdown counts the actions minutes used by machine type (e.g. UBUNTU, WINDOWS, MACOS).
+type MinutesUsedBreakdown = map[string]int
 
 // PackageBilling represents a GitHub Package billing.
 type PackageBilling struct {
-	TotalGigabytesBandwidthUsed     int `json:"total_gigabytes_bandwidth_used"`
-	TotalPaidGigabytesBandwidthUsed int `json:"total_paid_gigabytes_bandwidth_used"`
-	IncludedGigabytesBandwidth      int `json:"included_gigabytes_bandwidth"`
+	TotalGigabytesBandwidthUsed     int     `json:"total_gigabytes_bandwidth_used"`
+	TotalPaidGigabytesBandwidthUsed int     `json:"total_paid_gigabytes_bandwidth_used"`
+	IncludedGigabytesBandwidth      float64 `json:"included_gigabytes_bandwidth"`
 }
 
 // StorageBilling represents a GitHub Storage billing.
 type StorageBilling struct {
 	DaysLeftInBillingCycle       int     `json:"days_left_in_billing_cycle"`
 	EstimatedPaidStorageForMonth float64 `json:"estimated_paid_storage_for_month"`
-	EstimatedStorageForMonth     int     `json:"estimated_storage_for_month"`
+	EstimatedStorageForMonth     float64 `json:"estimated_storage_for_month"`
 }
 
 // ActiveCommitters represents the total active committers across all repositories in an Organization.
@@ -123,9 +120,14 @@ func (s *BillingService) GetStorageBillingOrg(ctx context.Context, org string) (
 
 // GetAdvancedSecurityActiveCommittersOrg returns the GitHub Advanced Security active committers for an organization per repository.
 //
-// GitHub API docs: https://docs.github.com/en/rest/billing#get-github-advanced-security-active-committers-for-an-organization
-func (s *BillingService) GetAdvancedSecurityActiveCommittersOrg(ctx context.Context, org string) (*ActiveCommitters, *Response, error) {
+// GitHub API docs: https://docs.github.com/en/enterprise-cloud@latest/rest/billing?apiVersion=2022-11-28#get-github-advanced-security-active-committers-for-an-organization
+func (s *BillingService) GetAdvancedSecurityActiveCommittersOrg(ctx context.Context, org string, opts *ListOptions) (*ActiveCommitters, *Response, error) {
 	u := fmt.Sprintf("orgs/%v/settings/billing/advanced-security", org)
+	u, err := addOptions(u, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+
 	req, err := s.client.NewRequest("GET", u, nil)
 	if err != nil {
 		return nil, nil, err
diff --git a/github/billing_test.go b/github/billing_test.go
index 2df9a0e..d7adcb0 100644
--- a/github/billing_test.go
+++ b/github/billing_test.go
@@ -21,9 +21,9 @@ func TestBillingService_GetActionsBillingOrg(t *testing.T) {
 	mux.HandleFunc("/orgs/o/settings/billing/actions", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, "GET")
 		fmt.Fprint(w, `{
-				"total_minutes_used": 305,
+				"total_minutes_used": 305.0,
 				"total_paid_minutes_used": 0.0,
-				"included_minutes": 3000,
+				"included_minutes": 3000.0,
 				"minutes_used_breakdown": {
 					"UBUNTU": 205,
 					"MACOS": 10,
@@ -39,13 +39,13 @@ func TestBillingService_GetActionsBillingOrg(t *testing.T) {
 	}
 
 	want := &ActionBilling{
-		TotalMinutesUsed:     305,
-		TotalPaidMinutesUsed: 0,
-		IncludedMinutes:      3000,
+		TotalMinutesUsed:     305.0,
+		TotalPaidMinutesUsed: 0.0,
+		IncludedMinutes:      3000.0,
 		MinutesUsedBreakdown: MinutesUsedBreakdown{
-			Ubuntu:  205,
-			MacOS:   10,
-			Windows: 90,
+			"UBUNTU":  205,
+			"MACOS":   10,
+			"WINDOWS": 90,
 		},
 	}
 	if !cmp.Equal(hook, want) {
@@ -209,9 +209,9 @@ func TestBillingService_GetActionsBillingUser(t *testing.T) {
 		TotalPaidMinutesUsed: 0,
 		IncludedMinutes:      3000,
 		MinutesUsedBreakdown: MinutesUsedBreakdown{
-			Ubuntu:  205,
-			MacOS:   10,
-			Windows: 90,
+			"UBUNTU":  205,
+			"MACOS":   10,
+			"WINDOWS": 90,
 		},
 	}
 	if !cmp.Equal(hook, want) {
@@ -350,9 +350,9 @@ func TestMinutesUsedBreakdown_Marshal(t *testing.T) {
 	testJSONMarshal(t, &MinutesUsedBreakdown{}, "{}")
 
 	u := &MinutesUsedBreakdown{
-		Ubuntu:  1,
-		MacOS:   1,
-		Windows: 1,
+		"UBUNTU":  1,
+		"MACOS":   1,
+		"WINDOWS": 1,
 	}
 
 	want := `{
@@ -372,9 +372,9 @@ func TestActionBilling_Marshal(t *testing.T) {
 		TotalPaidMinutesUsed: 1,
 		IncludedMinutes:      1,
 		MinutesUsedBreakdown: MinutesUsedBreakdown{
-			Ubuntu:  1,
-			MacOS:   1,
-			Windows: 1,
+			"UBUNTU":  1,
+			"MACOS":   1,
+			"WINDOWS": 1,
 		},
 	}
 
@@ -452,7 +452,8 @@ func TestBillingService_GetAdvancedSecurityActiveCommittersOrg(t *testing.T) {
 	})
 
 	ctx := context.Background()
-	hook, _, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "o")
+	opts := &ListOptions{Page: 2, PerPage: 50}
+	hook, _, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "o", opts)
 	if err != nil {
 		t.Errorf("Billing.GetAdvancedSecurityActiveCommittersOrg	 returned error: %v", err)
 	}
@@ -478,12 +479,12 @@ func TestBillingService_GetAdvancedSecurityActiveCommittersOrg(t *testing.T) {
 
 	const methodName = "GetAdvancedSecurityActiveCommittersOrg"
 	testBadOptions(t, methodName, func() (err error) {
-		_, _, err = client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "\n")
+		_, _, err = client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "\n", nil)
 		return err
 	})
 
 	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
-		got, resp, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "o")
+		got, resp, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "o", nil)
 		if got != nil {
 			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
 		}
@@ -496,6 +497,6 @@ func TestBillingService_GetAdvancedSecurityActiveCommittersOrg_invalidOrg(t *tes
 	defer teardown()
 
 	ctx := context.Background()
-	_, _, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "%")
+	_, _, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "%", nil)
 	testURLParseError(t, err)
 }
diff --git a/github/code-scanning.go b/github/code-scanning.go
index 53200fa..6717348 100644
--- a/github/code-scanning.go
+++ b/github/code-scanning.go
@@ -173,6 +173,22 @@ type SarifAnalysis struct {
 	ToolName    *string    `json:"tool_name,omitempty"`
 }
 
+// CodeScanningAlertState specifies the state of a code scanning alert.
+//
+// GitHub API docs: https://docs.github.com/en/rest/code-scanning
+type CodeScanningAlertState struct {
+	// State sets the state of the code scanning alert and is a required field.
+	// You must also provide DismissedReason when you set the state to "dismissed".
+	// State can be one of: "open", "dismissed".
+	State string `json:"state"`
+	// DismissedReason represents the reason for dismissing or closing the alert.
+	// It is required when the state is "dismissed".
+	// It can be one of: "false positive", "won't fix", "used in tests".
+	DismissedReason *string `json:"dismissed_reason,omitempty"`
+	// DismissedComment is associated with the dismissal of the alert.
+	DismissedComment *string `json:"dismissed_comment,omitempty"`
+}
+
 // SarifID identifies a sarif analysis upload.
 //
 // GitHub API docs: https://docs.github.com/en/rest/code-scanning
@@ -261,6 +277,31 @@ func (s *CodeScanningService) GetAlert(ctx context.Context, owner, repo string,
 	return a, resp, nil
 }
 
+// UpdateAlert updates the state of a single code scanning alert for a repository.
+//
+// You must use an access token with the security_events scope to use this endpoint.
+// GitHub Apps must have the security_events read permission to use this endpoint.
+//
+// The security alert_id is the number at the end of the security alert's URL.
+//
+// GitHub API docs: https://docs.github.com/en/rest/code-scanning?apiVersion=2022-11-28#update-a-code-scanning-alert
+func (s *CodeScanningService) UpdateAlert(ctx context.Context, owner, repo string, id int64, stateInfo *CodeScanningAlertState) (*Alert, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts/%v", owner, repo, id)
+
+	req, err := s.client.NewRequest("PATCH", u, stateInfo)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	a := new(Alert)
+	resp, err := s.client.Do(ctx, req, a)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return a, resp, nil
+}
+
 // UploadSarif uploads the result of code scanning job to GitHub.
 //
 // For the parameter sarif, you must first compress your SARIF file using gzip and then translate the contents of the file into a Base64 encoding string.
diff --git a/github/code-scanning_test.go b/github/code-scanning_test.go
index c8cf35c..7911fca 100644
--- a/github/code-scanning_test.go
+++ b/github/code-scanning_test.go
@@ -83,7 +83,7 @@ func TestCodeScanningService_UploadSarif(t *testing.T) {
 		return err
 	})
 
-	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+	testNewRequestAndDoFailureCategory(t, methodName, client, codeScanningUploadCategory, func() (*Response, error) {
 		_, resp, err := client.CodeScanning.UploadSarif(ctx, "o", "r", sarifAnalysis)
 		return resp, err
 	})
@@ -613,6 +613,123 @@ func TestCodeScanningService_ListAlertsForRepo(t *testing.T) {
 	})
 }
 
+func TestCodeScanningService_UpdateAlert(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+	mux.HandleFunc("/repos/o/r/code-scanning/alerts/88", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PATCH")
+		fmt.Fprint(w, `{"rule_id":"js/useless-expression",
+				"rule_severity":"warning",
+				"rule_description":"Expression has no effect",
+				"tool": {
+					"name": "CodeQL",
+					"guid": null,
+					"version": "1.4.0"
+				},
+				"rule": {
+					"id": "useless expression",
+					"severity": "warning",
+					"description": "Expression has no effect",
+					"name": "useless expression",
+					"full_description": "Expression has no effect",
+					"help": "Expression has no effect"
+				},
+				"most_recent_instance": {
+					"ref": "refs/heads/main",
+					"state": "dismissed",
+					"commit_sha": "abcdefg12345",
+					"message": {
+						"text": "This path depends on a user-provided value."
+					},
+					"location": {
+						"path": "spec-main/api-session-spec.ts",
+						"start_line": 917,
+						"end_line": 917,
+						"start_column": 7,
+						"end_column": 18
+					},
+					"classifications": [
+						"test"
+					]
+				},
+				"created_at":"2019-01-02T15:04:05Z",
+				"state":"dismissed",
+				"dismissed_reason": "false positive",
+				"dismissed_comment": "This alert is not actually correct as sanitizer is used",
+				"closed_by":null,
+				"closed_at":null,
+				"url":"https://api.github.com/repos/o/r/code-scanning/alerts/88",
+				"html_url":"https://github.com/o/r/security/code-scanning/88"}`)
+	})
+
+	ctx := context.Background()
+	dismissedComment := String("This alert is not actually correct as sanitizer is used")
+	dismissedReason := String("false positive")
+	state := String("dismissed")
+	stateInfo := &CodeScanningAlertState{State: *state, DismissedReason: dismissedReason, DismissedComment: dismissedComment}
+	alert, _, err := client.CodeScanning.UpdateAlert(ctx, "o", "r", 88, stateInfo)
+	if err != nil {
+		t.Errorf("CodeScanning.UpdateAlert returned error: %v", err)
+	}
+
+	date := Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}
+	want := &Alert{
+		RuleID:          String("js/useless-expression"),
+		RuleSeverity:    String("warning"),
+		RuleDescription: String("Expression has no effect"),
+		Tool:            &Tool{Name: String("CodeQL"), GUID: nil, Version: String("1.4.0")},
+		Rule: &Rule{
+			ID:              String("useless expression"),
+			Severity:        String("warning"),
+			Description:     String("Expression has no effect"),
+			Name:            String("useless expression"),
+			FullDescription: String("Expression has no effect"),
+			Help:            String("Expression has no effect"),
+		},
+		CreatedAt:        &date,
+		State:            state,
+		DismissedReason:  dismissedReason,
+		DismissedComment: dismissedComment,
+		ClosedBy:         nil,
+		ClosedAt:         nil,
+		URL:              String("https://api.github.com/repos/o/r/code-scanning/alerts/88"),
+		HTMLURL:          String("https://github.com/o/r/security/code-scanning/88"),
+		MostRecentInstance: &MostRecentInstance{
+			Ref:       String("refs/heads/main"),
+			State:     String("dismissed"),
+			CommitSHA: String("abcdefg12345"),
+			Message: &Message{
+				Text: String("This path depends on a user-provided value."),
+			},
+			Location: &Location{
+				Path:        String("spec-main/api-session-spec.ts"),
+				StartLine:   Int(917),
+				EndLine:     Int(917),
+				StartColumn: Int(7),
+				EndColumn:   Int(18),
+			},
+			Classifications: []string{"test"},
+		},
+	}
+	if !cmp.Equal(alert, want) {
+		t.Errorf("CodeScanning.UpdateAlert returned %+v, want %+v", alert, want)
+	}
+
+	const methodName = "UpdateAlert"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.CodeScanning.UpdateAlert(ctx, "\n", "\n", -88, stateInfo)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.CodeScanning.UpdateAlert(ctx, "o", "r", 88, stateInfo)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
 func TestCodeScanningService_GetAlert(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
diff --git a/github/doc.go b/github/doc.go
index 0c4afaa..1acf8d5 100644
--- a/github/doc.go
+++ b/github/doc.go
@@ -8,7 +8,7 @@ Package github provides a client for using the GitHub API.
 
 Usage:
 
-	import "github.com/google/go-github/v48/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
+	import "github.com/google/go-github/v52/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
 	import "github.com/google/go-github/github"     // with go modules disabled
 
 Construct a new GitHub client, then use the various services on the client to
diff --git a/github/enterprise_code_security_and_analysis.go b/github/enterprise_code_security_and_analysis.go
new file mode 100644
index 0000000..3980a86
--- /dev/null
+++ b/github/enterprise_code_security_and_analysis.go
@@ -0,0 +1,78 @@
+// Copyright 2022 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+)
+
+// EnterpriseSecurityAnalysisSettings represents security analysis settings for an enterprise.
+type EnterpriseSecurityAnalysisSettings struct {
+	AdvancedSecurityEnabledForNewRepositories             *bool   `json:"advanced_security_enabled_for_new_repositories,omitempty"`
+	SecretScanningEnabledForNewRepositories               *bool   `json:"secret_scanning_enabled_for_new_repositories,omitempty"`
+	SecretScanningPushProtectionEnabledForNewRepositories *bool   `json:"secret_scanning_push_protection_enabled_for_new_repositories,omitempty"`
+	SecretScanningPushProtectionCustomLink                *string `json:"secret_scanning_push_protection_custom_link,omitempty"`
+}
+
+// GetCodeSecurityAndAnalysis gets code security and analysis features for an enterprise.
+//
+// GitHub API docs: https://docs.github.com/en/rest/enterprise-admin/code-security-and-analysis?apiVersion=2022-11-28#get-code-security-and-analysis-features-for-an-enterprise
+func (s *EnterpriseService) GetCodeSecurityAndAnalysis(ctx context.Context, enterprise string) (*EnterpriseSecurityAnalysisSettings, *Response, error) {
+	u := fmt.Sprintf("enterprises/%v/code_security_and_analysis", enterprise)
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	settings := new(EnterpriseSecurityAnalysisSettings)
+	resp, err := s.client.Do(ctx, req, settings)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return settings, resp, nil
+}
+
+// UpdateCodeSecurityAndAnalysis updates code security and analysis features for new repositories in an enterprise.
+//
+// GitHub API docs: https://docs.github.com/en/rest/enterprise-admin/code-security-and-analysis?apiVersion=2022-11-28#update-code-security-and-analysis-features-for-an-enterprise
+func (s *EnterpriseService) UpdateCodeSecurityAndAnalysis(ctx context.Context, enterprise string, settings *EnterpriseSecurityAnalysisSettings) (*Response, error) {
+	u := fmt.Sprintf("enterprises/%v/code_security_and_analysis", enterprise)
+	req, err := s.client.NewRequest("PATCH", u, settings)
+	if err != nil {
+		return nil, err
+	}
+
+	resp, err := s.client.Do(ctx, req, nil)
+	if err != nil {
+		return resp, err
+	}
+
+	return resp, nil
+}
+
+// EnableDisableSecurityFeature enables or disables a security feature for all repositories in an enterprise.
+//
+// Valid values for securityProduct: "advanced_security", "secret_scanning", "secret_scanning_push_protection".
+// Valid values for enablement:  "enable_all", "disable_all".
+//
+// GitHub API docs: https://docs.github.com/en/enterprise-cloud@latest/rest/enterprise-admin/code-security-and-analysis?apiVersion=2022-11-28#enable-or-disable-a-security-feature
+func (s *EnterpriseService) EnableDisableSecurityFeature(ctx context.Context, enterprise, securityProduct, enablement string) (*Response, error) {
+	u := fmt.Sprintf("enterprises/%v/%v/%v", enterprise, securityProduct, enablement)
+	req, err := s.client.NewRequest("POST", u, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	resp, err := s.client.Do(ctx, req, nil)
+	if err != nil {
+		return resp, err
+	}
+
+	return resp, nil
+}
diff --git a/github/enterprise_code_security_and_analysis_test.go b/github/enterprise_code_security_and_analysis_test.go
new file mode 100644
index 0000000..24bf89c
--- /dev/null
+++ b/github/enterprise_code_security_and_analysis_test.go
@@ -0,0 +1,132 @@
+// Copyright 2022 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+)
+
+func TestEnterpriseService_GetCodeSecurityAndAnalysis(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/enterprises/e/code_security_and_analysis", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+
+		fmt.Fprint(w, `
+		{
+		  "advanced_security_enabled_for_new_repositories": true,
+		  "secret_scanning_enabled_for_new_repositories": true,
+		  "secret_scanning_push_protection_enabled_for_new_repositories": true,
+		  "secret_scanning_push_protection_custom_link": "https://github.com/test-org/test-repo/blob/main/README.md"
+		}`)
+	})
+
+	ctx := context.Background()
+
+	const methodName = "GetCodeSecurityAndAnalysis"
+
+	settings, _, err := client.Enterprise.GetCodeSecurityAndAnalysis(ctx, "e")
+	if err != nil {
+		t.Errorf("Enterprise.%v returned error: %v", methodName, err)
+	}
+	want := &EnterpriseSecurityAnalysisSettings{
+		AdvancedSecurityEnabledForNewRepositories:             Bool(true),
+		SecretScanningEnabledForNewRepositories:               Bool(true),
+		SecretScanningPushProtectionEnabledForNewRepositories: Bool(true),
+		SecretScanningPushProtectionCustomLink:                String("https://github.com/test-org/test-repo/blob/main/README.md"),
+	}
+
+	if !cmp.Equal(settings, want) {
+		t.Errorf("Enterprise.%v return \ngot: %+v,\nwant:%+v", methodName, settings, want)
+	}
+
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Enterprise.GetCodeSecurityAndAnalysis(ctx, "o")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Enterprise.GetCodeSecurityAndAnalysis(ctx, "e")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestEnterpriseService_UpdateCodeSecurityAndAnalysis(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	input := &EnterpriseSecurityAnalysisSettings{
+		AdvancedSecurityEnabledForNewRepositories:             Bool(true),
+		SecretScanningEnabledForNewRepositories:               Bool(true),
+		SecretScanningPushProtectionEnabledForNewRepositories: Bool(true),
+		SecretScanningPushProtectionCustomLink:                String("https://github.com/test-org/test-repo/blob/main/README.md"),
+	}
+
+	mux.HandleFunc("/enterprises/e/code_security_and_analysis", func(w http.ResponseWriter, r *http.Request) {
+		v := new(EnterpriseSecurityAnalysisSettings)
+		json.NewDecoder(r.Body).Decode(v)
+
+		testMethod(t, r, "PATCH")
+		if !cmp.Equal(v, input) {
+			t.Errorf("Request body = %+v, want %+v", v, input)
+		}
+	})
+
+	ctx := context.Background()
+
+	const methodName = "UpdateCodeSecurityAndAnalysis"
+
+	_, err := client.Enterprise.UpdateCodeSecurityAndAnalysis(ctx, "e", input)
+	if err != nil {
+		t.Errorf("Enterprise.%v returned error: %v", methodName, err)
+	}
+
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Enterprise.UpdateCodeSecurityAndAnalysis(ctx, "o", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Enterprise.UpdateCodeSecurityAndAnalysis(ctx, "e", input)
+	})
+}
+
+func TestEnterpriseService_EnableAdvancedSecurity(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/enterprises/e/advanced_security/enable_all", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "POST")
+	})
+
+	ctx := context.Background()
+
+	const methodName = "EnableDisableSecurityFeature"
+
+	_, err := client.Enterprise.EnableDisableSecurityFeature(ctx, "e", "advanced_security", "enable_all")
+	if err != nil {
+		t.Errorf("Enterprise.%v returned error: %v", methodName, err)
+	}
+
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Enterprise.EnableDisableSecurityFeature(ctx, "o", "advanced_security", "enable_all")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Enterprise.EnableDisableSecurityFeature(ctx, "e", "advanced_security", "enable_all")
+	})
+}
diff --git a/github/event.go b/github/event.go
index 5b2312f..1aabf13 100644
--- a/github/event.go
+++ b/github/event.go
@@ -7,7 +7,6 @@ package github
 
 import (
 	"encoding/json"
-	"time"
 )
 
 // Event represents a GitHub event.
@@ -18,7 +17,7 @@ type Event struct {
 	Repo       *Repository      `json:"repo,omitempty"`
 	Actor      *User            `json:"actor,omitempty"`
 	Org        *Organization    `json:"org,omitempty"`
-	CreatedAt  *time.Time       `json:"created_at,omitempty"`
+	CreatedAt  *Timestamp       `json:"created_at,omitempty"`
 	ID         *string          `json:"id,omitempty"`
 }
 
@@ -54,6 +53,8 @@ func (e *Event) ParsePayload() (payload interface{}, err error) {
 		payload = &DeploymentStatusEvent{}
 	case "DiscussionEvent":
 		payload = &DiscussionEvent{}
+	case "DiscussionCommentEvent":
+		payload = &DiscussionCommentEvent{}
 	case "ForkEvent":
 		payload = &ForkEvent{}
 	case "GitHubAppAuthorizationEvent":
diff --git a/github/event_test.go b/github/event_test.go
index 713f3b1..6d20582 100644
--- a/github/event_test.go
+++ b/github/event_test.go
@@ -78,7 +78,7 @@ func TestEvent_Marshal(t *testing.T) {
 			MembersCanCreatePublicPages:          Bool(false),
 			MembersCanCreatePrivatePages:         Bool(true),
 		},
-		CreatedAt: &referenceTime,
+		CreatedAt: &Timestamp{referenceTime},
 		ID:        String("id"),
 	}
 
diff --git a/github/event_types.go b/github/event_types.go
index 6c59b7b..685e46f 100644
--- a/github/event_types.go
+++ b/github/event_types.go
@@ -189,6 +189,39 @@ type DeploymentStatusEvent struct {
 	Installation *Installation `json:"installation,omitempty"`
 }
 
+// DiscussionCommentEvent represents a webhook event for a comment on discussion.
+// The Webhook event name is "discussion_comment".
+//
+// GitHub API docs: https://docs.github.com/webhooks-and-events/webhooks/webhook-events-and-payloads#discussion_comment
+type DiscussionCommentEvent struct {
+	// Action is the action that was performed on the comment.
+	// Possible values are: "created", "edited", "deleted". ** check what all can be added
+	Action       *string            `json:"action,omitempty"`
+	Discussion   *Discussion        `json:"discussion,omitempty"`
+	Comment      *CommentDiscussion `json:"comment,omitempty"`
+	Repo         *Repository        `json:"repository,omitempty"`
+	Org          *Organization      `json:"organization,omitempty"`
+	Sender       *User              `json:"sender,omitempty"`
+	Installation *Installation      `json:"installation,omitempty"`
+}
+
+// CommentDiscussion represents a comment in a GitHub DiscussionCommentEvent.
+type CommentDiscussion struct {
+	AuthorAssociation *string    `json:"author_association,omitempty"`
+	Body              *string    `json:"body,omitempty"`
+	ChildCommentCount *int       `json:"child_comment_count,omitempty"`
+	CreatedAt         *Timestamp `json:"created_at,omitempty"`
+	DiscussionID      *int64     `json:"discussion_id,omitempty"`
+	HTMLURL           *string    `json:"html_url,omitempty"`
+	ID                *int64     `json:"id,omitempty"`
+	NodeID            *string    `json:"node_id,omitempty"`
+	ParentID          *int64     `json:"parent_id,omitempty"`
+	Reactions         *Reactions `json:"reactions,omitempty"`
+	RepositoryURL     *string    `json:"repository_url,omitempty"`
+	UpdatedAt         *Timestamp `json:"updated_at,omitempty"`
+	User              *User      `json:"user,omitempty"`
+}
+
 // DiscussionEvent represents a webhook event for a discussion.
 // The Webhook event name is "discussion".
 //
@@ -299,6 +332,7 @@ type EditChange struct {
 	Body  *EditBody  `json:"body,omitempty"`
 	Base  *EditBase  `json:"base,omitempty"`
 	Repo  *EditRepo  `json:"repository,omitempty"`
+	Owner *EditOwner `json:"owner,omitempty"`
 }
 
 // EditTitle represents a pull-request title change.
@@ -327,6 +361,17 @@ type EditRepo struct {
 	Name *RepoName `json:"name,omitempty"`
 }
 
+// EditOwner represents a change of repository ownership.
+type EditOwner struct {
+	OwnerInfo *OwnerInfo `json:"from,omitempty"`
+}
+
+// OwnerInfo represents the account info of the owner of the repo (could be User or Organization but both are User structs).
+type OwnerInfo struct {
+	User *User `json:"user,omitempty"`
+	Org  *User `json:"organization,omitempty"`
+}
+
 // RepoName represents a change of repository name.
 type RepoName struct {
 	From *string `json:"from,omitempty"`
@@ -424,7 +469,7 @@ type InstallationEvent struct {
 	Repositories []*Repository `json:"repositories,omitempty"`
 	Sender       *User         `json:"sender,omitempty"`
 	Installation *Installation `json:"installation,omitempty"`
-	// TODO key "requester" is not covered
+	Requester    *User         `json:"requester,omitempty"`
 }
 
 // InstallationRepositoriesEvent is triggered when a repository is added or
@@ -485,6 +530,7 @@ type IssuesEvent struct {
 	Repo         *Repository   `json:"repository,omitempty"`
 	Sender       *User         `json:"sender,omitempty"`
 	Installation *Installation `json:"installation,omitempty"`
+	Milestone    *Milestone    `json:"milestone,omitempty"`
 }
 
 // LabelEvent is triggered when a repository's label is created, edited, or deleted.
@@ -1028,6 +1074,7 @@ type PushEventRepository struct {
 	SSHURL          *string    `json:"ssh_url,omitempty"`
 	CloneURL        *string    `json:"clone_url,omitempty"`
 	SVNURL          *string    `json:"svn_url,omitempty"`
+	Topics          []string   `json:"topics,omitempty"`
 }
 
 // PushEventRepoOwner is a basic representation of user/org in a PushEvent payload.
@@ -1389,4 +1436,6 @@ type CodeScanningAlertEvent struct {
 	Repo      *Repository   `json:"repository,omitempty"`
 	Org       *Organization `json:"organization,omitempty"`
 	Sender    *User         `json:"sender,omitempty"`
+
+	Installation *Installation `json:"installation,omitempty"`
 }
diff --git a/github/event_types_test.go b/github/event_types_test.go
index 8cd0868..cdbaee5 100644
--- a/github/event_types_test.go
+++ b/github/event_types_test.go
@@ -104,6 +104,82 @@ func TestEditChange_Marshal_Repo(t *testing.T) {
 	testJSONMarshal(t, u, want)
 }
 
+func TestEditChange_Marshal_TransferFromUser(t *testing.T) {
+	testJSONMarshal(t, &EditChange{}, "{}")
+
+	u := &EditChange{
+		Owner: &EditOwner{
+			OwnerInfo: &OwnerInfo{
+				User: &User{
+					Login:     String("l"),
+					ID:        Int64(1),
+					NodeID:    String("n"),
+					URL:       String("u"),
+					ReposURL:  String("r"),
+					EventsURL: String("e"),
+					AvatarURL: String("a"),
+				},
+			},
+		},
+	}
+
+	want := `{
+		"owner": {
+			"from": {
+				"user": {
+					"login": "l",
+          			"id": 1,
+         		 	"node_id": "n",
+          			"avatar_url": "a",
+          			"url": "u",
+          			"repos_url": "r",
+          			"events_url": "e"
+				}
+			}
+		}
+	}`
+
+	testJSONMarshal(t, u, want)
+}
+
+func TestEditChange_Marshal_TransferFromOrg(t *testing.T) {
+	testJSONMarshal(t, &EditChange{}, "{}")
+
+	u := &EditChange{
+		Owner: &EditOwner{
+			OwnerInfo: &OwnerInfo{
+				Org: &User{
+					Login:     String("l"),
+					ID:        Int64(1),
+					NodeID:    String("n"),
+					URL:       String("u"),
+					ReposURL:  String("r"),
+					EventsURL: String("e"),
+					AvatarURL: String("a"),
+				},
+			},
+		},
+	}
+
+	want := `{
+		"owner": {
+			"from": {
+				"organization": {
+					"login": "l",
+          			"id": 1,
+         		 	"node_id": "n",
+          			"avatar_url": "a",
+          			"url": "u",
+          			"repos_url": "r",
+          			"events_url": "e"
+				}
+			}
+		}
+	}`
+
+	testJSONMarshal(t, u, want)
+}
+
 func TestProjectChange_Marshal_NameChange(t *testing.T) {
 	testJSONMarshal(t, &ProjectChange{}, "{}")
 
@@ -4855,8 +4931,8 @@ func TestCommitCommentEvent_Marshal(t *testing.T) {
 				Eyes:       Int(1),
 				URL:        String("url"),
 			},
-			CreatedAt: &referenceTime,
-			UpdatedAt: &referenceTime,
+			CreatedAt: &Timestamp{referenceTime},
+			UpdatedAt: &Timestamp{referenceTime},
 			Body:      String("b"),
 			Path:      String("path"),
 			Position:  Int(1),
@@ -5740,6 +5816,420 @@ func TestDeploymentStatusEvent_Marshal(t *testing.T) {
 	testJSONMarshal(t, u, want)
 }
 
+func TestDiscussionCommentEvent_Marshal(t *testing.T) {
+	testJSONMarshal(t, &DiscussionCommentEvent{}, "{}")
+
+	u := &DiscussionCommentEvent{
+		Comment: &CommentDiscussion{
+			AuthorAssociation: String("aa"),
+			Body:              String("bo"),
+			ChildCommentCount: Int(1),
+			CreatedAt:         &Timestamp{referenceTime},
+			DiscussionID:      Int64(1),
+			HTMLURL:           String("hurl"),
+			ID:                Int64(1),
+			NodeID:            String("nid"),
+			ParentID:          Int64(1),
+			Reactions: &Reactions{
+				TotalCount: Int(1),
+				PlusOne:    Int(1),
+				MinusOne:   Int(1),
+				Laugh:      Int(1),
+				Confused:   Int(1),
+				Heart:      Int(1),
+				Hooray:     Int(1),
+				Rocket:     Int(1),
+				Eyes:       Int(1),
+				URL:        String("url"),
+			},
+			RepositoryURL: String("rurl"),
+			UpdatedAt:     &Timestamp{referenceTime},
+			User: &User{
+				Login:     String("l"),
+				ID:        Int64(1),
+				NodeID:    String("n"),
+				URL:       String("u"),
+				ReposURL:  String("r"),
+				EventsURL: String("e"),
+				AvatarURL: String("a"),
+			},
+		},
+		Discussion: &Discussion{
+			RepositoryURL: String("rurl"),
+			DiscussionCategory: &DiscussionCategory{
+				ID:           Int64(1),
+				NodeID:       String("nid"),
+				RepositoryID: Int64(1),
+				Emoji:        String("emoji"),
+				Name:         String("name"),
+				Description:  String("description"),
+				CreatedAt:    &Timestamp{referenceTime},
+				UpdatedAt:    &Timestamp{referenceTime},
+				Slug:         String("slug"),
+				IsAnswerable: Bool(false),
+			},
+			HTMLURL: String("hurl"),
+			ID:      Int64(1),
+			NodeID:  String("nurl"),
+			Number:  Int(1),
+			Title:   String("title"),
+			User: &User{
+				Login:     String("l"),
+				ID:        Int64(1),
+				NodeID:    String("n"),
+				URL:       String("u"),
+				ReposURL:  String("r"),
+				EventsURL: String("e"),
+				AvatarURL: String("a"),
+			},
+			State:             String("st"),
+			Locked:            Bool(false),
+			Comments:          Int(1),
+			CreatedAt:         &Timestamp{referenceTime},
+			UpdatedAt:         &Timestamp{referenceTime},
+			AuthorAssociation: String("aa"),
+			Body:              String("bo"),
+		},
+		Repo: &Repository{
+			ID:   Int64(1),
+			URL:  String("s"),
+			Name: String("n"),
+		},
+		Org: &Organization{
+			BillingEmail:                         String("be"),
+			Blog:                                 String("b"),
+			Company:                              String("c"),
+			Email:                                String("e"),
+			TwitterUsername:                      String("tu"),
+			Location:                             String("loc"),
+			Name:                                 String("n"),
+			Description:                          String("d"),
+			IsVerified:                           Bool(true),
+			HasOrganizationProjects:              Bool(true),
+			HasRepositoryProjects:                Bool(true),
+			DefaultRepoPermission:                String("drp"),
+			MembersCanCreateRepos:                Bool(true),
+			MembersCanCreateInternalRepos:        Bool(true),
+			MembersCanCreatePrivateRepos:         Bool(true),
+			MembersCanCreatePublicRepos:          Bool(false),
+			MembersAllowedRepositoryCreationType: String("marct"),
+			MembersCanCreatePages:                Bool(true),
+			MembersCanCreatePublicPages:          Bool(false),
+			MembersCanCreatePrivatePages:         Bool(true),
+		},
+		Sender: &User{
+			Login:     String("l"),
+			ID:        Int64(1),
+			NodeID:    String("n"),
+			URL:       String("u"),
+			ReposURL:  String("r"),
+			EventsURL: String("e"),
+			AvatarURL: String("a"),
+		},
+		Installation: &Installation{
+			ID:       Int64(1),
+			NodeID:   String("nid"),
+			AppID:    Int64(1),
+			AppSlug:  String("as"),
+			TargetID: Int64(1),
+			Account: &User{
+				Login:           String("l"),
+				ID:              Int64(1),
+				URL:             String("u"),
+				AvatarURL:       String("a"),
+				GravatarID:      String("g"),
+				Name:            String("n"),
+				Company:         String("c"),
+				Blog:            String("b"),
+				Location:        String("l"),
+				Email:           String("e"),
+				Hireable:        Bool(true),
+				Bio:             String("b"),
+				TwitterUsername: String("t"),
+				PublicRepos:     Int(1),
+				Followers:       Int(1),
+				Following:       Int(1),
+				CreatedAt:       &Timestamp{referenceTime},
+				SuspendedAt:     &Timestamp{referenceTime},
+			},
+			AccessTokensURL:     String("atu"),
+			RepositoriesURL:     String("ru"),
+			HTMLURL:             String("hu"),
+			TargetType:          String("tt"),
+			SingleFileName:      String("sfn"),
+			RepositorySelection: String("rs"),
+			Events:              []string{"e"},
+			SingleFilePaths:     []string{"s"},
+			Permissions: &InstallationPermissions{
+				Actions:                       String("a"),
+				Administration:                String("ad"),
+				Checks:                        String("c"),
+				Contents:                      String("co"),
+				ContentReferences:             String("cr"),
+				Deployments:                   String("d"),
+				Environments:                  String("e"),
+				Issues:                        String("i"),
+				Metadata:                      String("md"),
+				Members:                       String("m"),
+				OrganizationAdministration:    String("oa"),
+				OrganizationHooks:             String("oh"),
+				OrganizationPlan:              String("op"),
+				OrganizationPreReceiveHooks:   String("opr"),
+				OrganizationProjects:          String("op"),
+				OrganizationSecrets:           String("os"),
+				OrganizationSelfHostedRunners: String("osh"),
+				OrganizationUserBlocking:      String("oub"),
+				Packages:                      String("pkg"),
+				Pages:                         String("pg"),
+				PullRequests:                  String("pr"),
+				RepositoryHooks:               String("rh"),
+				RepositoryProjects:            String("rp"),
+				RepositoryPreReceiveHooks:     String("rprh"),
+				Secrets:                       String("s"),
+				SecretScanningAlerts:          String("ssa"),
+				SecurityEvents:                String("se"),
+				SingleFile:                    String("sf"),
+				Statuses:                      String("s"),
+				TeamDiscussions:               String("td"),
+				VulnerabilityAlerts:           String("va"),
+				Workflows:                     String("w"),
+			},
+			CreatedAt:              &Timestamp{referenceTime},
+			UpdatedAt:              &Timestamp{referenceTime},
+			HasMultipleSingleFiles: Bool(false),
+			SuspendedBy: &User{
+				Login:           String("l"),
+				ID:              Int64(1),
+				URL:             String("u"),
+				AvatarURL:       String("a"),
+				GravatarID:      String("g"),
+				Name:            String("n"),
+				Company:         String("c"),
+				Blog:            String("b"),
+				Location:        String("l"),
+				Email:           String("e"),
+				Hireable:        Bool(true),
+				Bio:             String("b"),
+				TwitterUsername: String("t"),
+				PublicRepos:     Int(1),
+				Followers:       Int(1),
+				Following:       Int(1),
+				CreatedAt:       &Timestamp{referenceTime},
+				SuspendedAt:     &Timestamp{referenceTime},
+			},
+			SuspendedAt: &Timestamp{referenceTime},
+		},
+	}
+
+	want := `{
+		"comment": {
+			"author_association": "aa",
+			"body": "bo",
+			"child_comment_count": 1,
+			"created_at": ` + referenceTimeStr + `,
+			"discussion_id": 1,
+			"html_url": "hurl",
+			"id": 1,
+			"node_id": "nid",
+			"parent_id": 1,
+			"reactions": {
+				"total_count": 1,
+				"+1": 1,
+				"-1": 1,
+				"laugh": 1,
+				"confused": 1,
+				"heart": 1,
+				"hooray": 1,
+				"rocket": 1,
+				"eyes": 1,
+				"url": "url"
+			},
+			"repository_url": "rurl",
+			"updated_at": ` + referenceTimeStr + `,
+			"user": {
+				"login": "l",
+				"id": 1,
+				"node_id": "n",
+				"avatar_url": "a",
+				"url": "u",
+				"events_url": "e",
+				"repos_url": "r"
+			}
+		},
+		"discussion": {
+			"repository_url": "rurl",
+			"category": {
+				"id": 1,
+				"node_id": "nid",
+				"repository_id": 1,
+				"emoji": "emoji",
+				"name": "name",
+				"description": "description",
+				"created_at": ` + referenceTimeStr + `,
+				"updated_at": ` + referenceTimeStr + `,
+				"slug": "slug",
+				"is_answerable": false
+			},
+			"html_url": "hurl",
+			"id": 1,
+			"node_id": "nurl",
+			"number": 1,
+			"title": "title",
+			"user": {
+				"login": "l",
+				"id": 1,
+				"node_id": "n",
+				"avatar_url": "a",
+				"url": "u",
+				"events_url": "e",
+				"repos_url": "r"
+			},
+			"state": "st",
+			"locked": false,
+			"comments": 1,
+			"created_at": ` + referenceTimeStr + `,
+			"updated_at": ` + referenceTimeStr + `,
+			"author_association": "aa",
+			"body": "bo"
+		},
+		"repository": {
+			"id": 1,
+			"name": "n",
+			"url": "s"
+		},
+		"organization": {
+			"name": "n",
+			"company": "c",
+			"blog": "b",
+			"location": "loc",
+			"email": "e",
+			"twitter_username": "tu",
+			"description": "d",
+			"billing_email": "be",
+			"is_verified": true,
+			"has_organization_projects": true,
+			"has_repository_projects": true,
+			"default_repository_permission": "drp",
+			"members_can_create_repositories": true,
+			"members_can_create_public_repositories": false,
+			"members_can_create_private_repositories": true,
+			"members_can_create_internal_repositories": true,
+			"members_allowed_repository_creation_type": "marct",
+			"members_can_create_pages": true,
+			"members_can_create_public_pages": false,
+			"members_can_create_private_pages": true
+		},
+		"sender": {
+			"login": "l",
+			"id": 1,
+			"node_id": "n",
+			"avatar_url": "a",
+			"url": "u",
+			"events_url": "e",
+			"repos_url": "r"
+		},
+		"installation": {
+			"id": 1,
+			"node_id": "nid",
+			"app_id": 1,
+			"app_slug": "as",
+			"target_id": 1,
+			"account": {
+				"login": "l",
+				"id": 1,
+				"avatar_url": "a",
+				"gravatar_id": "g",
+				"name": "n",
+				"company": "c",
+				"blog": "b",
+				"location": "l",
+				"email": "e",
+				"hireable": true,
+				"bio": "b",
+				"twitter_username": "t",
+				"public_repos": 1,
+				"followers": 1,
+				"following": 1,
+				"created_at": ` + referenceTimeStr + `,
+				"suspended_at": ` + referenceTimeStr + `,
+				"url": "u"
+			},
+			"access_tokens_url": "atu",
+			"repositories_url": "ru",
+			"html_url": "hu",
+			"target_type": "tt",
+			"single_file_name": "sfn",
+			"repository_selection": "rs",
+			"events": [
+				"e"
+			],
+			"single_file_paths": [
+				"s"
+			],
+			"permissions": {
+				"actions": "a",
+				"administration": "ad",
+				"checks": "c",
+				"contents": "co",
+				"content_references": "cr",
+				"deployments": "d",
+				"environments": "e",
+				"issues": "i",
+				"metadata": "md",
+				"members": "m",
+				"organization_administration": "oa",
+				"organization_hooks": "oh",
+				"organization_plan": "op",
+				"organization_pre_receive_hooks": "opr",
+				"organization_projects": "op",
+				"organization_secrets": "os",
+				"organization_self_hosted_runners": "osh",
+				"organization_user_blocking": "oub",
+				"packages": "pkg",
+				"pages": "pg",
+				"pull_requests": "pr",
+				"repository_hooks": "rh",
+				"repository_projects": "rp",
+				"repository_pre_receive_hooks": "rprh",
+				"secrets": "s",
+				"secret_scanning_alerts": "ssa",
+				"security_events": "se",
+				"single_file": "sf",
+				"statuses": "s",
+				"team_discussions": "td",
+				"vulnerability_alerts": "va",
+				"workflows": "w"
+			},
+			"created_at": ` + referenceTimeStr + `,
+			"updated_at": ` + referenceTimeStr + `,
+			"has_multiple_single_files": false,
+			"suspended_by": {
+				"login": "l",
+				"id": 1,
+				"avatar_url": "a",
+				"gravatar_id": "g",
+				"name": "n",
+				"company": "c",
+				"blog": "b",
+				"location": "l",
+				"email": "e",
+				"hireable": true,
+				"bio": "b",
+				"twitter_username": "t",
+				"public_repos": 1,
+				"followers": 1,
+				"following": 1,
+				"created_at": ` + referenceTimeStr + `,
+				"suspended_at": ` + referenceTimeStr + `,
+				"url": "u"
+			},
+			"suspended_at": ` + referenceTimeStr + `
+		}
+	}`
+
+	testJSONMarshal(t, u, want)
+}
+
 func TestDiscussionEvent_Marshal(t *testing.T) {
 	testJSONMarshal(t, &DiscussionEvent{}, "{}")
 
@@ -6224,8 +6714,8 @@ func TestPingEvent_Marshal(t *testing.T) {
 		Zen:    String("z"),
 		HookID: Int64(1),
 		Hook: &Hook{
-			CreatedAt:    &referenceTime,
-			UpdatedAt:    &referenceTime,
+			CreatedAt:    &Timestamp{referenceTime},
+			UpdatedAt:    &Timestamp{referenceTime},
 			URL:          String("url"),
 			ID:           Int64(1),
 			Type:         String("t"),
@@ -10698,8 +11188,8 @@ func TestMetaEvent_Marshal(t *testing.T) {
 		Action: String("a"),
 		HookID: Int64(1),
 		Hook: &Hook{
-			CreatedAt:    &referenceTime,
-			UpdatedAt:    &referenceTime,
+			CreatedAt:    &Timestamp{referenceTime},
+			UpdatedAt:    &Timestamp{referenceTime},
 			URL:          String("u"),
 			ID:           Int64(1),
 			Type:         String("t"),
@@ -11745,7 +12235,7 @@ func TestHeadCommit_Marshal(t *testing.T) {
 	u := &HeadCommit{
 		Message: String("m"),
 		Author: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("n"),
 			Email: String("e"),
 			Login: String("u"),
@@ -11757,7 +12247,7 @@ func TestHeadCommit_Marshal(t *testing.T) {
 		TreeID:    String("tid"),
 		Timestamp: &Timestamp{referenceTime},
 		Committer: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("n"),
 			Email: String("e"),
 			Login: String("u"),
@@ -11857,6 +12347,7 @@ func TestPushEventRepository_Marshal(t *testing.T) {
 		SSHURL:          String("s"),
 		CloneURL:        String("c"),
 		SVNURL:          String("s"),
+		Topics:          []string{"octocat", "api"},
 	}
 
 	want := `{
@@ -11911,8 +12402,9 @@ func TestPushEventRepository_Marshal(t *testing.T) {
 		"git_url": "g",
 		"ssh_url": "s",
 		"clone_url": "c",
-		"svn_url": "s"
-	}`
+		"svn_url": "s",
+		"topics": ["octocat","api"]
+    }`
 
 	testJSONMarshal(t, u, want)
 }
diff --git a/github/examples_test.go b/github/examples_test.go
index 79c226f..4628b38 100644
--- a/github/examples_test.go
+++ b/github/examples_test.go
@@ -12,7 +12,7 @@ import (
 	"fmt"
 	"log"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 )
 
 func ExampleClient_Markdown() {
diff --git a/github/gists.go b/github/gists.go
index ecdc6f2..80961fc 100644
--- a/github/gists.go
+++ b/github/gists.go
@@ -28,8 +28,8 @@ type Gist struct {
 	HTMLURL     *string                   `json:"html_url,omitempty"`
 	GitPullURL  *string                   `json:"git_pull_url,omitempty"`
 	GitPushURL  *string                   `json:"git_push_url,omitempty"`
-	CreatedAt   *time.Time                `json:"created_at,omitempty"`
-	UpdatedAt   *time.Time                `json:"updated_at,omitempty"`
+	CreatedAt   *Timestamp                `json:"created_at,omitempty"`
+	UpdatedAt   *Timestamp                `json:"updated_at,omitempty"`
 	NodeID      *string                   `json:"node_id,omitempty"`
 }
 
diff --git a/github/gists_comments.go b/github/gists_comments.go
index d551e9a..ee0fbfa 100644
--- a/github/gists_comments.go
+++ b/github/gists_comments.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // GistComment represents a Gist comment.
@@ -17,7 +16,7 @@ type GistComment struct {
 	URL       *string    `json:"url,omitempty"`
 	Body      *string    `json:"body,omitempty"`
 	User      *User      `json:"user,omitempty"`
-	CreatedAt *time.Time `json:"created_at,omitempty"`
+	CreatedAt *Timestamp `json:"created_at,omitempty"`
 }
 
 func (g GistComment) String() string {
diff --git a/github/gists_comments_test.go b/github/gists_comments_test.go
index 0b3cb73..c9c9706 100644
--- a/github/gists_comments_test.go
+++ b/github/gists_comments_test.go
@@ -42,7 +42,7 @@ func TestGistComments_Marshal(t *testing.T) {
 			CreatedAt:   &Timestamp{referenceTime},
 			URL:         String("u"),
 		},
-		CreatedAt: &createdAt,
+		CreatedAt: &Timestamp{createdAt},
 	}
 
 	want := `{
diff --git a/github/gists_test.go b/github/gists_test.go
index 06a1c43..3066d58 100644
--- a/github/gists_test.go
+++ b/github/gists_test.go
@@ -57,8 +57,8 @@ func TestGist_Marshal(t *testing.T) {
 		HTMLURL:    String("html-url"),
 		GitPullURL: String("gitpull-url"),
 		GitPushURL: String("gitpush-url"),
-		CreatedAt:  &createdAt,
-		UpdatedAt:  &updatedAt,
+		CreatedAt:  &Timestamp{createdAt},
+		UpdatedAt:  &Timestamp{updatedAt},
 		NodeID:     String("node"),
 	}
 
diff --git a/github/git_commits.go b/github/git_commits.go
index baedb3d..862837c 100644
--- a/github/git_commits.go
+++ b/github/git_commits.go
@@ -11,9 +11,8 @@ import (
 	"errors"
 	"fmt"
 	"strings"
-	"time"
 
-	"golang.org/x/crypto/openpgp"
+	"github.com/ProtonMail/go-crypto/openpgp"
 )
 
 // SignatureVerification represents GPG signature verification.
@@ -56,7 +55,7 @@ func (c Commit) String() string {
 // CommitAuthor represents the author or committer of a commit. The commit
 // author may not correspond to a GitHub User.
 type CommitAuthor struct {
-	Date  *time.Time `json:"date,omitempty"`
+	Date  *Timestamp `json:"date,omitempty"`
 	Name  *string    `json:"name,omitempty"`
 	Email *string    `json:"email,omitempty"`
 
diff --git a/github/git_commits_test.go b/github/git_commits_test.go
index cc9cc3f..efdb0a2 100644
--- a/github/git_commits_test.go
+++ b/github/git_commits_test.go
@@ -14,8 +14,8 @@ import (
 	"testing"
 	"time"
 
+	"github.com/ProtonMail/go-crypto/openpgp"
 	"github.com/google/go-cmp/cmp"
-	"golang.org/x/crypto/openpgp"
 )
 
 func TestCommit_Marshal(t *testing.T) {
@@ -24,13 +24,13 @@ func TestCommit_Marshal(t *testing.T) {
 	u := &Commit{
 		SHA: String("s"),
 		Author: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("n"),
 			Email: String("e"),
 			Login: String("u"),
 		},
 		Committer: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("n"),
 			Email: String("e"),
 			Login: String("u"),
@@ -309,11 +309,14 @@ func TestGitService_CreateSignedCommitWithKey(t *testing.T) {
 		t.Errorf("Error reading keyring: %+v", err)
 	}
 
+	// Set the key lifetime to nil so we don't care about the example key expiring and making tests fail
+	keyring[0].Identities["go-github <go-github@github.com>"].SelfSignature.KeyLifetimeSecs = nil
+
 	date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200")
 	author := CommitAuthor{
 		Name:  String("go-github"),
 		Email: String("go-github@github.com"),
-		Date:  &date,
+		Date:  &Timestamp{date},
 	}
 	input := &Commit{
 		Message:    String("Commit Message."),
@@ -344,7 +347,7 @@ Commit Message.`)
 		}
 
 		sigReader := strings.NewReader(*v.Signature)
-		signer, err := openpgp.CheckArmoredDetachedSignature(keyring, messageReader, sigReader)
+		signer, err := openpgp.CheckArmoredDetachedSignature(keyring, messageReader, sigReader, nil)
 		if err != nil {
 			t.Errorf("Error verifying signature: %+v", err)
 		}
@@ -409,15 +412,20 @@ func TestGitService_createSignature_noAuthor(t *testing.T) {
 
 func TestGitService_createSignature_invalidKey(t *testing.T) {
 	date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200")
+	authorName := "go-github"
+	authorEmail := "go-github@github.com"
+
+	signKey, _ := openpgp.NewEntity(authorName, "", authorEmail, nil)
+	_ = signKey.RevokeKey(0, "Invalidate key", nil)
 
-	_, err := createSignature(&openpgp.Entity{}, &createCommit{
+	_, err := createSignature(signKey, &createCommit{
 		Message: String("Commit Message."),
 		Tree:    String("t"),
 		Parents: []string{"p"},
 		Author: &CommitAuthor{
 			Name:  String("go-github"),
 			Email: String("go-github@github.com"),
-			Date:  &date,
+			Date:  &Timestamp{date},
 		},
 	})
 
@@ -442,7 +450,7 @@ func TestGitService_createSignatureMessage_nilMessage(t *testing.T) {
 		Author: &CommitAuthor{
 			Name:  String("go-github"),
 			Email: String("go-github@github.com"),
-			Date:  &date,
+			Date:  &Timestamp{date},
 		},
 	})
 	if err == nil {
@@ -459,7 +467,7 @@ func TestGitService_createSignatureMessage_emptyMessage(t *testing.T) {
 		Author: &CommitAuthor{
 			Name:  String("go-github"),
 			Email: String("go-github@github.com"),
-			Date:  &date,
+			Date:  &Timestamp{date},
 		},
 	})
 	if err == nil {
@@ -487,7 +495,7 @@ func TestGitService_createSignatureMessage_withoutTree(t *testing.T) {
 		Author: &CommitAuthor{
 			Name:  String("go-github"),
 			Email: String("go-github@github.com"),
-			Date:  &date,
+			Date:  &Timestamp{date},
 		},
 	})
 	expected := `parent p
@@ -509,12 +517,12 @@ func TestGitService_createSignatureMessage_withoutCommitter(t *testing.T) {
 		Author: &CommitAuthor{
 			Name:  String("go-github"),
 			Email: String("go-github@github.com"),
-			Date:  &date,
+			Date:  &Timestamp{date},
 		},
 		Committer: &CommitAuthor{
 			Name:  String("foo"),
 			Email: String("foo@bar.com"),
-			Date:  &date,
+			Date:  &Timestamp{date},
 		},
 	})
 	expected := `parent p
@@ -619,7 +627,7 @@ func TestCommitAuthor_Marshal(t *testing.T) {
 	testJSONMarshal(t, &CommitAuthor{}, "{}")
 
 	u := &CommitAuthor{
-		Date:  &referenceTime,
+		Date:  &Timestamp{referenceTime},
 		Name:  String("name"),
 		Email: String("email"),
 		Login: String("login"),
@@ -640,13 +648,13 @@ func TestCreateCommit_Marshal(t *testing.T) {
 
 	u := &createCommit{
 		Author: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("name"),
 			Email: String("email"),
 			Login: String("login"),
 		},
 		Committer: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("name"),
 			Email: String("email"),
 			Login: String("login"),
diff --git a/github/git_tags_test.go b/github/git_tags_test.go
index 2d13722..0d45ee2 100644
--- a/github/git_tags_test.go
+++ b/github/git_tags_test.go
@@ -107,7 +107,7 @@ func TestTag_Marshal(t *testing.T) {
 		URL:     String("url"),
 		Message: String("msg"),
 		Tagger: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("name"),
 			Email: String("email"),
 			Login: String("login"),
@@ -163,7 +163,7 @@ func TestCreateTagRequest_Marshal(t *testing.T) {
 		Object:  String("obj"),
 		Type:    String("type"),
 		Tagger: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("name"),
 			Email: String("email"),
 			Login: String("login"),
diff --git a/github/github-accessors.go b/github/github-accessors.go
index a01036d..2f40756 100644
--- a/github/github-accessors.go
+++ b/github/github-accessors.go
@@ -38,6 +38,94 @@ func (a *ActionsAllowed) GetVerifiedAllowed() bool {
 	return *a.VerifiedAllowed
 }
 
+// GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
+func (a *ActionsCache) GetCreatedAt() Timestamp {
+	if a == nil || a.CreatedAt == nil {
+		return Timestamp{}
+	}
+	return *a.CreatedAt
+}
+
+// GetID returns the ID field if it's non-nil, zero value otherwise.
+func (a *ActionsCache) GetID() int64 {
+	if a == nil || a.ID == nil {
+		return 0
+	}
+	return *a.ID
+}
+
+// GetKey returns the Key field if it's non-nil, zero value otherwise.
+func (a *ActionsCache) GetKey() string {
+	if a == nil || a.Key == nil {
+		return ""
+	}
+	return *a.Key
+}
+
+// GetLastAccessedAt returns the LastAccessedAt field if it's non-nil, zero value otherwise.
+func (a *ActionsCache) GetLastAccessedAt() Timestamp {
+	if a == nil || a.LastAccessedAt == nil {
+		return Timestamp{}
+	}
+	return *a.LastAccessedAt
+}
+
+// GetRef returns the Ref field if it's non-nil, zero value otherwise.
+func (a *ActionsCache) GetRef() string {
+	if a == nil || a.Ref == nil {
+		return ""
+	}
+	return *a.Ref
+}
+
+// GetSizeInBytes returns the SizeInBytes field if it's non-nil, zero value otherwise.
+func (a *ActionsCache) GetSizeInBytes() int64 {
+	if a == nil || a.SizeInBytes == nil {
+		return 0
+	}
+	return *a.SizeInBytes
+}
+
+// GetVersion returns the Version field if it's non-nil, zero value otherwise.
+func (a *ActionsCache) GetVersion() string {
+	if a == nil || a.Version == nil {
+		return ""
+	}
+	return *a.Version
+}
+
+// GetDirection returns the Direction field if it's non-nil, zero value otherwise.
+func (a *ActionsCacheListOptions) GetDirection() string {
+	if a == nil || a.Direction == nil {
+		return ""
+	}
+	return *a.Direction
+}
+
+// GetKey returns the Key field if it's non-nil, zero value otherwise.
+func (a *ActionsCacheListOptions) GetKey() string {
+	if a == nil || a.Key == nil {
+		return ""
+	}
+	return *a.Key
+}
+
+// GetRef returns the Ref field if it's non-nil, zero value otherwise.
+func (a *ActionsCacheListOptions) GetRef() string {
+	if a == nil || a.Ref == nil {
+		return ""
+	}
+	return *a.Ref
+}
+
+// GetSort returns the Sort field if it's non-nil, zero value otherwise.
+func (a *ActionsCacheListOptions) GetSort() string {
+	if a == nil || a.Sort == nil {
+		return ""
+	}
+	return *a.Sort
+}
+
 // GetAllowedActions returns the AllowedActions field if it's non-nil, zero value otherwise.
 func (a *ActionsPermissions) GetAllowedActions() string {
 	if a == nil || a.AllowedActions == nil {
@@ -86,6 +174,46 @@ func (a *ActionsPermissionsRepository) GetSelectedActionsURL() string {
 	return *a.SelectedActionsURL
 }
 
+// GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
+func (a *ActionsVariable) GetCreatedAt() Timestamp {
+	if a == nil || a.CreatedAt == nil {
+		return Timestamp{}
+	}
+	return *a.CreatedAt
+}
+
+// GetSelectedRepositoriesURL returns the SelectedRepositoriesURL field if it's non-nil, zero value otherwise.
+func (a *ActionsVariable) GetSelectedRepositoriesURL() string {
+	if a == nil || a.SelectedRepositoriesURL == nil {
+		return ""
+	}
+	return *a.SelectedRepositoriesURL
+}
+
+// GetSelectedRepositoryIDs returns the SelectedRepositoryIDs field.
+func (a *ActionsVariable) GetSelectedRepositoryIDs() *SelectedRepoIDs {
+	if a == nil {
+		return nil
+	}
+	return a.SelectedRepositoryIDs
+}
+
+// GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
+func (a *ActionsVariable) GetUpdatedAt() Timestamp {
+	if a == nil || a.UpdatedAt == nil {
+		return Timestamp{}
+	}
+	return *a.UpdatedAt
+}
+
+// GetVisibility returns the Visibility field if it's non-nil, zero value otherwise.
+func (a *ActionsVariable) GetVisibility() string {
+	if a == nil || a.Visibility == nil {
+		return ""
+	}
+	return *a.Visibility
+}
+
 // GetFrom returns the From field if it's non-nil, zero value otherwise.
 func (a *AdminEnforcedChanges) GetFrom() bool {
 	if a == nil || a.From == nil {
@@ -470,6 +598,14 @@ func (a *AllowDeletionsEnforcementLevelChanges) GetFrom() string {
 	return *a.From
 }
 
+// GetEnabled returns the Enabled field if it's non-nil, zero value otherwise.
+func (a *AllowForkSyncing) GetEnabled() bool {
+	if a == nil || a.Enabled == nil {
+		return false
+	}
+	return *a.Enabled
+}
+
 // GetRef returns the Ref field if it's non-nil, zero value otherwise.
 func (a *AnalysesListOptions) GetRef() string {
 	if a == nil || a.Ref == nil {
@@ -542,6 +678,14 @@ func (a *App) GetID() int64 {
 	return *a.ID
 }
 
+// GetInstallationsCount returns the InstallationsCount field if it's non-nil, zero value otherwise.
+func (a *App) GetInstallationsCount() int {
+	if a == nil || a.InstallationsCount == nil {
+		return 0
+	}
+	return *a.InstallationsCount
+}
+
 // GetName returns the Name field if it's non-nil, zero value otherwise.
 func (a *App) GetName() string {
 	if a == nil || a.Name == nil {
@@ -766,6 +910,30 @@ func (a *Artifact) GetSizeInBytes() int64 {
 	return *a.SizeInBytes
 }
 
+// GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
+func (a *Artifact) GetUpdatedAt() Timestamp {
+	if a == nil || a.UpdatedAt == nil {
+		return Timestamp{}
+	}
+	return *a.UpdatedAt
+}
+
+// GetURL returns the URL field if it's non-nil, zero value otherwise.
+func (a *Artifact) GetURL() string {
+	if a == nil || a.URL == nil {
+		return ""
+	}
+	return *a.URL
+}
+
+// GetWorkflowRun returns the WorkflowRun field.
+func (a *Artifact) GetWorkflowRun() *ArtifactWorkflowRun {
+	if a == nil {
+		return nil
+	}
+	return a.WorkflowRun
+}
+
 // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise.
 func (a *ArtifactList) GetTotalCount() int64 {
 	if a == nil || a.TotalCount == nil {
@@ -774,6 +942,46 @@ func (a *ArtifactList) GetTotalCount() int64 {
 	return *a.TotalCount
 }
 
+// GetHeadBranch returns the HeadBranch field if it's non-nil, zero value otherwise.
+func (a *ArtifactWorkflowRun) GetHeadBranch() string {
+	if a == nil || a.HeadBranch == nil {
+		return ""
+	}
+	return *a.HeadBranch
+}
+
+// GetHeadRepositoryID returns the HeadRepositoryID field if it's non-nil, zero value otherwise.
+func (a *ArtifactWorkflowRun) GetHeadRepositoryID() int64 {
+	if a == nil || a.HeadRepositoryID == nil {
+		return 0
+	}
+	return *a.HeadRepositoryID
+}
+
+// GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise.
+func (a *ArtifactWorkflowRun) GetHeadSHA() string {
+	if a == nil || a.HeadSHA == nil {
+		return ""
+	}
+	return *a.HeadSHA
+}
+
+// GetID returns the ID field if it's non-nil, zero value otherwise.
+func (a *ArtifactWorkflowRun) GetID() int64 {
+	if a == nil || a.ID == nil {
+		return 0
+	}
+	return *a.ID
+}
+
+// GetRepositoryID returns the RepositoryID field if it's non-nil, zero value otherwise.
+func (a *ArtifactWorkflowRun) GetRepositoryID() int64 {
+	if a == nil || a.RepositoryID == nil {
+		return 0
+	}
+	return *a.RepositoryID
+}
+
 // GetBody returns the Body field if it's non-nil, zero value otherwise.
 func (a *Attachment) GetBody() string {
 	if a == nil || a.Body == nil {
@@ -1022,6 +1230,14 @@ func (a *AuditEntry) GetName() string {
 	return *a.Name
 }
 
+// GetOldPermission returns the OldPermission field if it's non-nil, zero value otherwise.
+func (a *AuditEntry) GetOldPermission() string {
+	if a == nil || a.OldPermission == nil {
+		return ""
+	}
+	return *a.OldPermission
+}
+
 // GetOldUser returns the OldUser field if it's non-nil, zero value otherwise.
 func (a *AuditEntry) GetOldUser() string {
 	if a == nil || a.OldUser == nil {
@@ -1046,6 +1262,14 @@ func (a *AuditEntry) GetOrg() string {
 	return *a.Org
 }
 
+// GetPermission returns the Permission field if it's non-nil, zero value otherwise.
+func (a *AuditEntry) GetPermission() string {
+	if a == nil || a.Permission == nil {
+		return ""
+	}
+	return *a.Permission
+}
+
 // GetPreviousVisibility returns the PreviousVisibility field if it's non-nil, zero value otherwise.
 func (a *AuditEntry) GetPreviousVisibility() string {
 	if a == nil || a.PreviousVisibility == nil {
@@ -1550,6 +1774,14 @@ func (b *Blob) GetURL() string {
 	return *b.URL
 }
 
+// GetEnabled returns the Enabled field if it's non-nil, zero value otherwise.
+func (b *BlockCreations) GetEnabled() bool {
+	if b == nil || b.Enabled == nil {
+		return false
+	}
+	return *b.Enabled
+}
+
 // GetCommit returns the Commit field.
 func (b *Branch) GetCommit() *RepositoryCommit {
 	if b == nil {
@@ -2446,6 +2678,14 @@ func (c *CodeScanningAlertEvent) GetCommitOID() string {
 	return *c.CommitOID
 }
 
+// GetInstallation returns the Installation field.
+func (c *CodeScanningAlertEvent) GetInstallation() *Installation {
+	if c == nil {
+		return nil
+	}
+	return c.Installation
+}
+
 // GetOrg returns the Org field.
 func (c *CodeScanningAlertEvent) GetOrg() *Organization {
 	if c == nil {
@@ -2478,6 +2718,22 @@ func (c *CodeScanningAlertEvent) GetSender() *User {
 	return c.Sender
 }
 
+// GetDismissedComment returns the DismissedComment field if it's non-nil, zero value otherwise.
+func (c *CodeScanningAlertState) GetDismissedComment() string {
+	if c == nil || c.DismissedComment == nil {
+		return ""
+	}
+	return *c.DismissedComment
+}
+
+// GetDismissedReason returns the DismissedReason field if it's non-nil, zero value otherwise.
+func (c *CodeScanningAlertState) GetDismissedReason() string {
+	if c == nil || c.DismissedReason == nil {
+		return ""
+	}
+	return *c.DismissedReason
+}
+
 // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise.
 func (c *CodeSearchResult) GetIncompleteResults() bool {
 	if c == nil || c.IncompleteResults == nil {
@@ -2607,102 +2863,206 @@ func (c *CombinedStatus) GetTotalCount() int {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (c *Comment) GetCreatedAt() time.Time {
+func (c *Comment) GetCreatedAt() Timestamp {
 	if c == nil || c.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *c.CreatedAt
 }
 
-// GetTotalCommitComments returns the TotalCommitComments field if it's non-nil, zero value otherwise.
-func (c *CommentStats) GetTotalCommitComments() int {
-	if c == nil || c.TotalCommitComments == nil {
-		return 0
-	}
-	return *c.TotalCommitComments
-}
-
-// GetTotalGistComments returns the TotalGistComments field if it's non-nil, zero value otherwise.
-func (c *CommentStats) GetTotalGistComments() int {
-	if c == nil || c.TotalGistComments == nil {
-		return 0
+// GetAuthorAssociation returns the AuthorAssociation field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetAuthorAssociation() string {
+	if c == nil || c.AuthorAssociation == nil {
+		return ""
 	}
-	return *c.TotalGistComments
+	return *c.AuthorAssociation
 }
 
-// GetTotalIssueComments returns the TotalIssueComments field if it's non-nil, zero value otherwise.
-func (c *CommentStats) GetTotalIssueComments() int {
-	if c == nil || c.TotalIssueComments == nil {
-		return 0
+// GetBody returns the Body field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetBody() string {
+	if c == nil || c.Body == nil {
+		return ""
 	}
-	return *c.TotalIssueComments
+	return *c.Body
 }
 
-// GetTotalPullRequestComments returns the TotalPullRequestComments field if it's non-nil, zero value otherwise.
-func (c *CommentStats) GetTotalPullRequestComments() int {
-	if c == nil || c.TotalPullRequestComments == nil {
+// GetChildCommentCount returns the ChildCommentCount field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetChildCommentCount() int {
+	if c == nil || c.ChildCommentCount == nil {
 		return 0
 	}
-	return *c.TotalPullRequestComments
+	return *c.ChildCommentCount
 }
 
-// GetAuthor returns the Author field.
-func (c *Commit) GetAuthor() *CommitAuthor {
-	if c == nil {
-		return nil
+// GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetCreatedAt() Timestamp {
+	if c == nil || c.CreatedAt == nil {
+		return Timestamp{}
 	}
-	return c.Author
+	return *c.CreatedAt
 }
 
-// GetCommentCount returns the CommentCount field if it's non-nil, zero value otherwise.
-func (c *Commit) GetCommentCount() int {
-	if c == nil || c.CommentCount == nil {
+// GetDiscussionID returns the DiscussionID field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetDiscussionID() int64 {
+	if c == nil || c.DiscussionID == nil {
 		return 0
 	}
-	return *c.CommentCount
-}
-
-// GetCommitter returns the Committer field.
-func (c *Commit) GetCommitter() *CommitAuthor {
-	if c == nil {
-		return nil
-	}
-	return c.Committer
+	return *c.DiscussionID
 }
 
 // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise.
-func (c *Commit) GetHTMLURL() string {
+func (c *CommentDiscussion) GetHTMLURL() string {
 	if c == nil || c.HTMLURL == nil {
 		return ""
 	}
 	return *c.HTMLURL
 }
 
-// GetMessage returns the Message field if it's non-nil, zero value otherwise.
-func (c *Commit) GetMessage() string {
-	if c == nil || c.Message == nil {
-		return ""
+// GetID returns the ID field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetID() int64 {
+	if c == nil || c.ID == nil {
+		return 0
 	}
-	return *c.Message
+	return *c.ID
 }
 
 // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise.
-func (c *Commit) GetNodeID() string {
+func (c *CommentDiscussion) GetNodeID() string {
 	if c == nil || c.NodeID == nil {
 		return ""
 	}
 	return *c.NodeID
 }
 
-// GetSHA returns the SHA field if it's non-nil, zero value otherwise.
-func (c *Commit) GetSHA() string {
-	if c == nil || c.SHA == nil {
-		return ""
+// GetParentID returns the ParentID field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetParentID() int64 {
+	if c == nil || c.ParentID == nil {
+		return 0
 	}
-	return *c.SHA
+	return *c.ParentID
 }
 
-// GetStats returns the Stats field.
+// GetReactions returns the Reactions field.
+func (c *CommentDiscussion) GetReactions() *Reactions {
+	if c == nil {
+		return nil
+	}
+	return c.Reactions
+}
+
+// GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetRepositoryURL() string {
+	if c == nil || c.RepositoryURL == nil {
+		return ""
+	}
+	return *c.RepositoryURL
+}
+
+// GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
+func (c *CommentDiscussion) GetUpdatedAt() Timestamp {
+	if c == nil || c.UpdatedAt == nil {
+		return Timestamp{}
+	}
+	return *c.UpdatedAt
+}
+
+// GetUser returns the User field.
+func (c *CommentDiscussion) GetUser() *User {
+	if c == nil {
+		return nil
+	}
+	return c.User
+}
+
+// GetTotalCommitComments returns the TotalCommitComments field if it's non-nil, zero value otherwise.
+func (c *CommentStats) GetTotalCommitComments() int {
+	if c == nil || c.TotalCommitComments == nil {
+		return 0
+	}
+	return *c.TotalCommitComments
+}
+
+// GetTotalGistComments returns the TotalGistComments field if it's non-nil, zero value otherwise.
+func (c *CommentStats) GetTotalGistComments() int {
+	if c == nil || c.TotalGistComments == nil {
+		return 0
+	}
+	return *c.TotalGistComments
+}
+
+// GetTotalIssueComments returns the TotalIssueComments field if it's non-nil, zero value otherwise.
+func (c *CommentStats) GetTotalIssueComments() int {
+	if c == nil || c.TotalIssueComments == nil {
+		return 0
+	}
+	return *c.TotalIssueComments
+}
+
+// GetTotalPullRequestComments returns the TotalPullRequestComments field if it's non-nil, zero value otherwise.
+func (c *CommentStats) GetTotalPullRequestComments() int {
+	if c == nil || c.TotalPullRequestComments == nil {
+		return 0
+	}
+	return *c.TotalPullRequestComments
+}
+
+// GetAuthor returns the Author field.
+func (c *Commit) GetAuthor() *CommitAuthor {
+	if c == nil {
+		return nil
+	}
+	return c.Author
+}
+
+// GetCommentCount returns the CommentCount field if it's non-nil, zero value otherwise.
+func (c *Commit) GetCommentCount() int {
+	if c == nil || c.CommentCount == nil {
+		return 0
+	}
+	return *c.CommentCount
+}
+
+// GetCommitter returns the Committer field.
+func (c *Commit) GetCommitter() *CommitAuthor {
+	if c == nil {
+		return nil
+	}
+	return c.Committer
+}
+
+// GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise.
+func (c *Commit) GetHTMLURL() string {
+	if c == nil || c.HTMLURL == nil {
+		return ""
+	}
+	return *c.HTMLURL
+}
+
+// GetMessage returns the Message field if it's non-nil, zero value otherwise.
+func (c *Commit) GetMessage() string {
+	if c == nil || c.Message == nil {
+		return ""
+	}
+	return *c.Message
+}
+
+// GetNodeID returns the NodeID field if it's non-nil, zero value otherwise.
+func (c *Commit) GetNodeID() string {
+	if c == nil || c.NodeID == nil {
+		return ""
+	}
+	return *c.NodeID
+}
+
+// GetSHA returns the SHA field if it's non-nil, zero value otherwise.
+func (c *Commit) GetSHA() string {
+	if c == nil || c.SHA == nil {
+		return ""
+	}
+	return *c.SHA
+}
+
+// GetStats returns the Stats field.
 func (c *Commit) GetStats() *CommitStats {
 	if c == nil {
 		return nil
@@ -2735,9 +3095,9 @@ func (c *Commit) GetVerification() *SignatureVerification {
 }
 
 // GetDate returns the Date field if it's non-nil, zero value otherwise.
-func (c *CommitAuthor) GetDate() time.Time {
+func (c *CommitAuthor) GetDate() Timestamp {
 	if c == nil || c.Date == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *c.Date
 }
@@ -3191,9 +3551,9 @@ func (c *CommunityHealthMetrics) GetHealthPercentage() int {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (c *CommunityHealthMetrics) GetUpdatedAt() time.Time {
+func (c *CommunityHealthMetrics) GetUpdatedAt() Timestamp {
 	if c == nil || c.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *c.UpdatedAt
 }
@@ -3670,6 +4030,14 @@ func (c *CreateRunnerGroupRequest) GetVisibility() string {
 	return *c.Visibility
 }
 
+// GetCanAdminsBypass returns the CanAdminsBypass field if it's non-nil, zero value otherwise.
+func (c *CreateUpdateEnvironment) GetCanAdminsBypass() bool {
+	if c == nil || c.CanAdminsBypass == nil {
+		return false
+	}
+	return *c.CanAdminsBypass
+}
+
 // GetDeploymentBranchPolicy returns the DeploymentBranchPolicy field.
 func (c *CreateUpdateEnvironment) GetDeploymentBranchPolicy() *BranchPolicy {
 	if c == nil {
@@ -3686,6 +4054,38 @@ func (c *CreateUpdateEnvironment) GetWaitTimer() int {
 	return *c.WaitTimer
 }
 
+// GetRepositoryID returns the RepositoryID field if it's non-nil, zero value otherwise.
+func (c *CreateUpdateRequiredWorkflowOptions) GetRepositoryID() int64 {
+	if c == nil || c.RepositoryID == nil {
+		return 0
+	}
+	return *c.RepositoryID
+}
+
+// GetScope returns the Scope field if it's non-nil, zero value otherwise.
+func (c *CreateUpdateRequiredWorkflowOptions) GetScope() string {
+	if c == nil || c.Scope == nil {
+		return ""
+	}
+	return *c.Scope
+}
+
+// GetSelectedRepositoryIDs returns the SelectedRepositoryIDs field.
+func (c *CreateUpdateRequiredWorkflowOptions) GetSelectedRepositoryIDs() *SelectedRepoIDs {
+	if c == nil {
+		return nil
+	}
+	return c.SelectedRepositoryIDs
+}
+
+// GetWorkflowFilePath returns the WorkflowFilePath field if it's non-nil, zero value otherwise.
+func (c *CreateUpdateRequiredWorkflowOptions) GetWorkflowFilePath() string {
+	if c == nil || c.WorkflowFilePath == nil {
+		return ""
+	}
+	return *c.WorkflowFilePath
+}
+
 // GetBody returns the Body field if it's non-nil, zero value otherwise.
 func (c *CreateUserProjectOptions) GetBody() string {
 	if c == nil || c.Body == nil {
@@ -4134,6 +4534,46 @@ func (d *Deployment) GetURL() string {
 	return *d.URL
 }
 
+// GetID returns the ID field if it's non-nil, zero value otherwise.
+func (d *DeploymentBranchPolicy) GetID() int64 {
+	if d == nil || d.ID == nil {
+		return 0
+	}
+	return *d.ID
+}
+
+// GetName returns the Name field if it's non-nil, zero value otherwise.
+func (d *DeploymentBranchPolicy) GetName() string {
+	if d == nil || d.Name == nil {
+		return ""
+	}
+	return *d.Name
+}
+
+// GetNodeID returns the NodeID field if it's non-nil, zero value otherwise.
+func (d *DeploymentBranchPolicy) GetNodeID() string {
+	if d == nil || d.NodeID == nil {
+		return ""
+	}
+	return *d.NodeID
+}
+
+// GetName returns the Name field if it's non-nil, zero value otherwise.
+func (d *DeploymentBranchPolicyRequest) GetName() string {
+	if d == nil || d.Name == nil {
+		return ""
+	}
+	return *d.Name
+}
+
+// GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise.
+func (d *DeploymentBranchPolicyResponse) GetTotalCount() int {
+	if d == nil || d.TotalCount == nil {
+		return 0
+	}
+	return *d.TotalCount
+}
+
 // GetDeployment returns the Deployment field.
 func (d *DeploymentEvent) GetDeployment() *Deployment {
 	if d == nil {
@@ -4766,6 +5206,62 @@ func (d *DiscussionComment) GetURL() string {
 	return *d.URL
 }
 
+// GetAction returns the Action field if it's non-nil, zero value otherwise.
+func (d *DiscussionCommentEvent) GetAction() string {
+	if d == nil || d.Action == nil {
+		return ""
+	}
+	return *d.Action
+}
+
+// GetComment returns the Comment field.
+func (d *DiscussionCommentEvent) GetComment() *CommentDiscussion {
+	if d == nil {
+		return nil
+	}
+	return d.Comment
+}
+
+// GetDiscussion returns the Discussion field.
+func (d *DiscussionCommentEvent) GetDiscussion() *Discussion {
+	if d == nil {
+		return nil
+	}
+	return d.Discussion
+}
+
+// GetInstallation returns the Installation field.
+func (d *DiscussionCommentEvent) GetInstallation() *Installation {
+	if d == nil {
+		return nil
+	}
+	return d.Installation
+}
+
+// GetOrg returns the Org field.
+func (d *DiscussionCommentEvent) GetOrg() *Organization {
+	if d == nil {
+		return nil
+	}
+	return d.Org
+}
+
+// GetRepo returns the Repo field.
+func (d *DiscussionCommentEvent) GetRepo() *Repository {
+	if d == nil {
+		return nil
+	}
+	return d.Repo
+}
+
+// GetSender returns the Sender field.
+func (d *DiscussionCommentEvent) GetSender() *User {
+	if d == nil {
+		return nil
+	}
+	return d.Sender
+}
+
 // GetAction returns the Action field if it's non-nil, zero value otherwise.
 func (d *DiscussionEvent) GetAction() string {
 	if d == nil || d.Action == nil {
@@ -4982,6 +5478,14 @@ func (e *EditChange) GetBody() *EditBody {
 	return e.Body
 }
 
+// GetOwner returns the Owner field.
+func (e *EditChange) GetOwner() *EditOwner {
+	if e == nil {
+		return nil
+	}
+	return e.Owner
+}
+
 // GetRepo returns the Repo field.
 func (e *EditChange) GetRepo() *EditRepo {
 	if e == nil {
@@ -4998,6 +5502,14 @@ func (e *EditChange) GetTitle() *EditTitle {
 	return e.Title
 }
 
+// GetOwnerInfo returns the OwnerInfo field.
+func (e *EditOwner) GetOwnerInfo() *OwnerInfo {
+	if e == nil {
+		return nil
+	}
+	return e.OwnerInfo
+}
+
 // GetFrom returns the From field if it's non-nil, zero value otherwise.
 func (e *EditRef) GetFrom() string {
 	if e == nil || e.From == nil {
@@ -5110,6 +5622,46 @@ func (e *Enterprise) GetWebsiteURL() string {
 	return *e.WebsiteURL
 }
 
+// GetAdvancedSecurityEnabledForNewRepositories returns the AdvancedSecurityEnabledForNewRepositories field if it's non-nil, zero value otherwise.
+func (e *EnterpriseSecurityAnalysisSettings) GetAdvancedSecurityEnabledForNewRepositories() bool {
+	if e == nil || e.AdvancedSecurityEnabledForNewRepositories == nil {
+		return false
+	}
+	return *e.AdvancedSecurityEnabledForNewRepositories
+}
+
+// GetSecretScanningEnabledForNewRepositories returns the SecretScanningEnabledForNewRepositories field if it's non-nil, zero value otherwise.
+func (e *EnterpriseSecurityAnalysisSettings) GetSecretScanningEnabledForNewRepositories() bool {
+	if e == nil || e.SecretScanningEnabledForNewRepositories == nil {
+		return false
+	}
+	return *e.SecretScanningEnabledForNewRepositories
+}
+
+// GetSecretScanningPushProtectionCustomLink returns the SecretScanningPushProtectionCustomLink field if it's non-nil, zero value otherwise.
+func (e *EnterpriseSecurityAnalysisSettings) GetSecretScanningPushProtectionCustomLink() string {
+	if e == nil || e.SecretScanningPushProtectionCustomLink == nil {
+		return ""
+	}
+	return *e.SecretScanningPushProtectionCustomLink
+}
+
+// GetSecretScanningPushProtectionEnabledForNewRepositories returns the SecretScanningPushProtectionEnabledForNewRepositories field if it's non-nil, zero value otherwise.
+func (e *EnterpriseSecurityAnalysisSettings) GetSecretScanningPushProtectionEnabledForNewRepositories() bool {
+	if e == nil || e.SecretScanningPushProtectionEnabledForNewRepositories == nil {
+		return false
+	}
+	return *e.SecretScanningPushProtectionEnabledForNewRepositories
+}
+
+// GetCanAdminsBypass returns the CanAdminsBypass field if it's non-nil, zero value otherwise.
+func (e *Environment) GetCanAdminsBypass() bool {
+	if e == nil || e.CanAdminsBypass == nil {
+		return false
+	}
+	return *e.CanAdminsBypass
+}
+
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
 func (e *Environment) GetCreatedAt() Timestamp {
 	if e == nil || e.CreatedAt == nil {
@@ -5255,9 +5807,9 @@ func (e *Event) GetActor() *User {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (e *Event) GetCreatedAt() time.Time {
+func (e *Event) GetCreatedAt() Timestamp {
 	if e == nil || e.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *e.CreatedAt
 }
@@ -5591,9 +6143,9 @@ func (g *Gist) GetComments() int {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (g *Gist) GetCreatedAt() time.Time {
+func (g *Gist) GetCreatedAt() Timestamp {
 	if g == nil || g.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *g.CreatedAt
 }
@@ -5671,9 +6223,9 @@ func (g *Gist) GetPublic() bool {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (g *Gist) GetUpdatedAt() time.Time {
+func (g *Gist) GetUpdatedAt() Timestamp {
 	if g == nil || g.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *g.UpdatedAt
 }
@@ -5687,9 +6239,9 @@ func (g *GistComment) GetBody() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (g *GistComment) GetCreatedAt() time.Time {
+func (g *GistComment) GetCreatedAt() Timestamp {
 	if g == nil || g.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *g.CreatedAt
 }
@@ -6023,17 +6575,17 @@ func (g *GPGKey) GetCanSign() bool {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (g *GPGKey) GetCreatedAt() time.Time {
+func (g *GPGKey) GetCreatedAt() Timestamp {
 	if g == nil || g.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *g.CreatedAt
 }
 
 // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise.
-func (g *GPGKey) GetExpiresAt() time.Time {
+func (g *GPGKey) GetExpiresAt() Timestamp {
 	if g == nil || g.ExpiresAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *g.ExpiresAt
 }
@@ -6199,9 +6751,9 @@ func (h *Hook) GetActive() bool {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (h *Hook) GetCreatedAt() time.Time {
+func (h *Hook) GetCreatedAt() Timestamp {
 	if h == nil || h.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *h.CreatedAt
 }
@@ -6247,9 +6799,9 @@ func (h *Hook) GetType() string {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (h *Hook) GetUpdatedAt() time.Time {
+func (h *Hook) GetUpdatedAt() Timestamp {
 	if h == nil || h.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *h.UpdatedAt
 }
@@ -6814,6 +7366,14 @@ func (i *InstallationEvent) GetInstallation() *Installation {
 	return i.Installation
 }
 
+// GetRequester returns the Requester field.
+func (i *InstallationEvent) GetRequester() *User {
+	if i == nil {
+		return nil
+	}
+	return i.Requester
+}
+
 // GetSender returns the Sender field.
 func (i *InstallationEvent) GetSender() *User {
 	if i == nil {
@@ -7151,9 +7711,9 @@ func (i *InstallationRepositoriesEvent) GetSender() *User {
 }
 
 // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise.
-func (i *InstallationToken) GetExpiresAt() time.Time {
+func (i *InstallationToken) GetExpiresAt() Timestamp {
 	if i == nil || i.ExpiresAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.ExpiresAt
 }
@@ -7207,9 +7767,9 @@ func (i *InteractionRestriction) GetOrigin() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (i *Invitation) GetCreatedAt() time.Time {
+func (i *Invitation) GetCreatedAt() Timestamp {
 	if i == nil || i.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.CreatedAt
 }
@@ -7327,9 +7887,9 @@ func (i *Issue) GetBody() string {
 }
 
 // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise.
-func (i *Issue) GetClosedAt() time.Time {
+func (i *Issue) GetClosedAt() Timestamp {
 	if i == nil || i.ClosedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.ClosedAt
 }
@@ -7359,9 +7919,9 @@ func (i *Issue) GetCommentsURL() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (i *Issue) GetCreatedAt() time.Time {
+func (i *Issue) GetCreatedAt() Timestamp {
 	if i == nil || i.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.CreatedAt
 }
@@ -7470,6 +8030,14 @@ func (i *Issue) GetState() string {
 	return *i.State
 }
 
+// GetStateReason returns the StateReason field if it's non-nil, zero value otherwise.
+func (i *Issue) GetStateReason() string {
+	if i == nil || i.StateReason == nil {
+		return ""
+	}
+	return *i.StateReason
+}
+
 // GetTitle returns the Title field if it's non-nil, zero value otherwise.
 func (i *Issue) GetTitle() string {
 	if i == nil || i.Title == nil {
@@ -7479,9 +8047,9 @@ func (i *Issue) GetTitle() string {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (i *Issue) GetUpdatedAt() time.Time {
+func (i *Issue) GetUpdatedAt() Timestamp {
 	if i == nil || i.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.UpdatedAt
 }
@@ -7519,9 +8087,9 @@ func (i *IssueComment) GetBody() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (i *IssueComment) GetCreatedAt() time.Time {
+func (i *IssueComment) GetCreatedAt() Timestamp {
 	if i == nil || i.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.CreatedAt
 }
@@ -7567,9 +8135,9 @@ func (i *IssueComment) GetReactions() *Reactions {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (i *IssueComment) GetUpdatedAt() time.Time {
+func (i *IssueComment) GetUpdatedAt() Timestamp {
 	if i == nil || i.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.UpdatedAt
 }
@@ -7687,9 +8255,9 @@ func (i *IssueEvent) GetCommitID() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (i *IssueEvent) GetCreatedAt() time.Time {
+func (i *IssueEvent) GetCreatedAt() Timestamp {
 	if i == nil || i.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.CreatedAt
 }
@@ -7807,17 +8375,17 @@ func (i *IssueImport) GetClosed() bool {
 }
 
 // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise.
-func (i *IssueImport) GetClosedAt() time.Time {
+func (i *IssueImport) GetClosedAt() Timestamp {
 	if i == nil || i.ClosedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.ClosedAt
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (i *IssueImport) GetCreatedAt() time.Time {
+func (i *IssueImport) GetCreatedAt() Timestamp {
 	if i == nil || i.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.CreatedAt
 }
@@ -7831,9 +8399,9 @@ func (i *IssueImport) GetMilestone() int {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (i *IssueImport) GetUpdatedAt() time.Time {
+func (i *IssueImport) GetUpdatedAt() Timestamp {
 	if i == nil || i.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.UpdatedAt
 }
@@ -7879,9 +8447,9 @@ func (i *IssueImportError) GetValue() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (i *IssueImportResponse) GetCreatedAt() time.Time {
+func (i *IssueImportResponse) GetCreatedAt() Timestamp {
 	if i == nil || i.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.CreatedAt
 }
@@ -7935,9 +8503,9 @@ func (i *IssueImportResponse) GetStatus() string {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (i *IssueImportResponse) GetUpdatedAt() time.Time {
+func (i *IssueImportResponse) GetUpdatedAt() Timestamp {
 	if i == nil || i.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *i.UpdatedAt
 }
@@ -8086,6 +8654,14 @@ func (i *IssuesEvent) GetLabel() *Label {
 	return i.Label
 }
 
+// GetMilestone returns the Milestone field.
+func (i *IssuesEvent) GetMilestone() *Milestone {
+	if i == nil {
+		return nil
+	}
+	return i.Milestone
+}
+
 // GetRepo returns the Repo field.
 func (i *IssuesEvent) GetRepo() *Repository {
 	if i == nil {
@@ -8150,6 +8726,14 @@ func (j *Jobs) GetTotalCount() int {
 	return *j.TotalCount
 }
 
+// GetAddedBy returns the AddedBy field if it's non-nil, zero value otherwise.
+func (k *Key) GetAddedBy() string {
+	if k == nil || k.AddedBy == nil {
+		return ""
+	}
+	return *k.AddedBy
+}
+
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
 func (k *Key) GetCreatedAt() Timestamp {
 	if k == nil || k.CreatedAt == nil {
@@ -8174,6 +8758,14 @@ func (k *Key) GetKey() string {
 	return *k.Key
 }
 
+// GetLastUsed returns the LastUsed field if it's non-nil, zero value otherwise.
+func (k *Key) GetLastUsed() Timestamp {
+	if k == nil || k.LastUsed == nil {
+		return Timestamp{}
+	}
+	return *k.LastUsed
+}
+
 // GetReadOnly returns the ReadOnly field if it's non-nil, zero value otherwise.
 func (k *Key) GetReadOnly() bool {
 	if k == nil || k.ReadOnly == nil {
@@ -8734,6 +9326,14 @@ func (l *Location) GetStartLine() int {
 	return *l.StartLine
 }
 
+// GetEnabled returns the Enabled field if it's non-nil, zero value otherwise.
+func (l *LockBranch) GetEnabled() bool {
+	if l == nil || l.Enabled == nil {
+		return false
+	}
+	return *l.Enabled
+}
+
 // GetEffectiveDate returns the EffectiveDate field if it's non-nil, zero value otherwise.
 func (m *MarketplacePendingChange) GetEffectiveDate() Timestamp {
 	if m == nil || m.EffectiveDate == nil {
@@ -8926,6 +9526,14 @@ func (m *MarketplacePlanAccount) GetURL() string {
 	return *m.URL
 }
 
+// GetAccount returns the Account field.
+func (m *MarketplacePurchase) GetAccount() *MarketplacePurchaseAccount {
+	if m == nil {
+		return nil
+	}
+	return m.Account
+}
+
 // GetBillingCycle returns the BillingCycle field if it's non-nil, zero value otherwise.
 func (m *MarketplacePurchase) GetBillingCycle() string {
 	if m == nil || m.BillingCycle == nil {
@@ -8982,6 +9590,62 @@ func (m *MarketplacePurchase) GetUpdatedAt() Timestamp {
 	return *m.UpdatedAt
 }
 
+// GetEmail returns the Email field if it's non-nil, zero value otherwise.
+func (m *MarketplacePurchaseAccount) GetEmail() string {
+	if m == nil || m.Email == nil {
+		return ""
+	}
+	return *m.Email
+}
+
+// GetID returns the ID field if it's non-nil, zero value otherwise.
+func (m *MarketplacePurchaseAccount) GetID() int64 {
+	if m == nil || m.ID == nil {
+		return 0
+	}
+	return *m.ID
+}
+
+// GetLogin returns the Login field if it's non-nil, zero value otherwise.
+func (m *MarketplacePurchaseAccount) GetLogin() string {
+	if m == nil || m.Login == nil {
+		return ""
+	}
+	return *m.Login
+}
+
+// GetNodeID returns the NodeID field if it's non-nil, zero value otherwise.
+func (m *MarketplacePurchaseAccount) GetNodeID() string {
+	if m == nil || m.NodeID == nil {
+		return ""
+	}
+	return *m.NodeID
+}
+
+// GetOrganizationBillingEmail returns the OrganizationBillingEmail field if it's non-nil, zero value otherwise.
+func (m *MarketplacePurchaseAccount) GetOrganizationBillingEmail() string {
+	if m == nil || m.OrganizationBillingEmail == nil {
+		return ""
+	}
+	return *m.OrganizationBillingEmail
+}
+
+// GetType returns the Type field if it's non-nil, zero value otherwise.
+func (m *MarketplacePurchaseAccount) GetType() string {
+	if m == nil || m.Type == nil {
+		return ""
+	}
+	return *m.Type
+}
+
+// GetURL returns the URL field if it's non-nil, zero value otherwise.
+func (m *MarketplacePurchaseAccount) GetURL() string {
+	if m == nil || m.URL == nil {
+		return ""
+	}
+	return *m.URL
+}
+
 // GetAction returns the Action field if it's non-nil, zero value otherwise.
 func (m *MarketplacePurchaseEvent) GetAction() string {
 	if m == nil || m.Action == nil {
@@ -9447,9 +10111,9 @@ func (m *Migration) GetURL() string {
 }
 
 // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise.
-func (m *Milestone) GetClosedAt() time.Time {
+func (m *Milestone) GetClosedAt() Timestamp {
 	if m == nil || m.ClosedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *m.ClosedAt
 }
@@ -9463,9 +10127,9 @@ func (m *Milestone) GetClosedIssues() int {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (m *Milestone) GetCreatedAt() time.Time {
+func (m *Milestone) GetCreatedAt() Timestamp {
 	if m == nil || m.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *m.CreatedAt
 }
@@ -9487,9 +10151,9 @@ func (m *Milestone) GetDescription() string {
 }
 
 // GetDueOn returns the DueOn field if it's non-nil, zero value otherwise.
-func (m *Milestone) GetDueOn() time.Time {
+func (m *Milestone) GetDueOn() Timestamp {
 	if m == nil || m.DueOn == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *m.DueOn
 }
@@ -9559,9 +10223,9 @@ func (m *Milestone) GetTitle() string {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (m *Milestone) GetUpdatedAt() time.Time {
+func (m *Milestone) GetUpdatedAt() Timestamp {
 	if m == nil || m.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *m.UpdatedAt
 }
@@ -9815,9 +10479,9 @@ func (n *Notification) GetID() string {
 }
 
 // GetLastReadAt returns the LastReadAt field if it's non-nil, zero value otherwise.
-func (n *Notification) GetLastReadAt() time.Time {
+func (n *Notification) GetLastReadAt() Timestamp {
 	if n == nil || n.LastReadAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *n.LastReadAt
 }
@@ -9855,9 +10519,9 @@ func (n *Notification) GetUnread() bool {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (n *Notification) GetUpdatedAt() time.Time {
+func (n *Notification) GetUpdatedAt() Timestamp {
 	if n == nil || n.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *n.UpdatedAt
 }
@@ -9926,6 +10590,14 @@ func (o *OAuthAPP) GetURL() string {
 	return *o.URL
 }
 
+// GetUseDefault returns the UseDefault field if it's non-nil, zero value otherwise.
+func (o *OIDCSubjectClaimCustomTemplate) GetUseDefault() bool {
+	if o == nil || o.UseDefault == nil {
+		return false
+	}
+	return *o.UseDefault
+}
+
 // GetAdvancedSecurityEnabledForNewRepos returns the AdvancedSecurityEnabledForNewRepos field if it's non-nil, zero value otherwise.
 func (o *Organization) GetAdvancedSecurityEnabledForNewRepos() bool {
 	if o == nil || o.AdvancedSecurityEnabledForNewRepos == nil {
@@ -9975,9 +10647,9 @@ func (o *Organization) GetCompany() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (o *Organization) GetCreatedAt() time.Time {
+func (o *Organization) GetCreatedAt() Timestamp {
 	if o == nil || o.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *o.CreatedAt
 }
@@ -10239,7 +10911,7 @@ func (o *Organization) GetNodeID() string {
 }
 
 // GetOwnedPrivateRepos returns the OwnedPrivateRepos field if it's non-nil, zero value otherwise.
-func (o *Organization) GetOwnedPrivateRepos() int {
+func (o *Organization) GetOwnedPrivateRepos() int64 {
 	if o == nil || o.OwnedPrivateRepos == nil {
 		return 0
 	}
@@ -10311,7 +10983,7 @@ func (o *Organization) GetSecretScanningPushProtectionEnabledForNewRepos() bool
 }
 
 // GetTotalPrivateRepos returns the TotalPrivateRepos field if it's non-nil, zero value otherwise.
-func (o *Organization) GetTotalPrivateRepos() int {
+func (o *Organization) GetTotalPrivateRepos() int64 {
 	if o == nil || o.TotalPrivateRepos == nil {
 		return 0
 	}
@@ -10343,9 +11015,9 @@ func (o *Organization) GetType() string {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (o *Organization) GetUpdatedAt() time.Time {
+func (o *Organization) GetUpdatedAt() Timestamp {
 	if o == nil || o.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *o.UpdatedAt
 }
@@ -10470,6 +11142,94 @@ func (o *OrgBlockEvent) GetSender() *User {
 	return o.Sender
 }
 
+// GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetCreatedAt() Timestamp {
+	if o == nil || o.CreatedAt == nil {
+		return Timestamp{}
+	}
+	return *o.CreatedAt
+}
+
+// GetID returns the ID field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetID() int64 {
+	if o == nil || o.ID == nil {
+		return 0
+	}
+	return *o.ID
+}
+
+// GetName returns the Name field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetName() string {
+	if o == nil || o.Name == nil {
+		return ""
+	}
+	return *o.Name
+}
+
+// GetPath returns the Path field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetPath() string {
+	if o == nil || o.Path == nil {
+		return ""
+	}
+	return *o.Path
+}
+
+// GetRef returns the Ref field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetRef() string {
+	if o == nil || o.Ref == nil {
+		return ""
+	}
+	return *o.Ref
+}
+
+// GetRepository returns the Repository field.
+func (o *OrgRequiredWorkflow) GetRepository() *Repository {
+	if o == nil {
+		return nil
+	}
+	return o.Repository
+}
+
+// GetScope returns the Scope field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetScope() string {
+	if o == nil || o.Scope == nil {
+		return ""
+	}
+	return *o.Scope
+}
+
+// GetSelectedRepositoriesURL returns the SelectedRepositoriesURL field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetSelectedRepositoriesURL() string {
+	if o == nil || o.SelectedRepositoriesURL == nil {
+		return ""
+	}
+	return *o.SelectedRepositoriesURL
+}
+
+// GetState returns the State field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetState() string {
+	if o == nil || o.State == nil {
+		return ""
+	}
+	return *o.State
+}
+
+// GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflow) GetUpdatedAt() Timestamp {
+	if o == nil || o.UpdatedAt == nil {
+		return Timestamp{}
+	}
+	return *o.UpdatedAt
+}
+
+// GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise.
+func (o *OrgRequiredWorkflows) GetTotalCount() int {
+	if o == nil || o.TotalCount == nil {
+		return 0
+	}
+	return *o.TotalCount
+}
+
 // GetDisabledOrgs returns the DisabledOrgs field if it's non-nil, zero value otherwise.
 func (o *OrgStats) GetDisabledOrgs() int {
 	if o == nil || o.DisabledOrgs == nil {
@@ -10502,6 +11262,22 @@ func (o *OrgStats) GetTotalTeams() int {
 	return *o.TotalTeams
 }
 
+// GetOrg returns the Org field.
+func (o *OwnerInfo) GetOrg() *User {
+	if o == nil {
+		return nil
+	}
+	return o.Org
+}
+
+// GetUser returns the User field.
+func (o *OwnerInfo) GetUser() *User {
+	if o == nil {
+		return nil
+	}
+	return o.User
+}
+
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
 func (p *Package) GetCreatedAt() Timestamp {
 	if p == nil || p.CreatedAt == nil {
@@ -11174,6 +11950,14 @@ func (p *PageBuildEvent) GetSender() *User {
 	return p.Sender
 }
 
+// GetBuildType returns the BuildType field if it's non-nil, zero value otherwise.
+func (p *Pages) GetBuildType() string {
+	if p == nil || p.BuildType == nil {
+		return ""
+	}
+	return *p.BuildType
+}
+
 // GetCNAME returns the CNAME field if it's non-nil, zero value otherwise.
 func (p *Pages) GetCNAME() string {
 	if p == nil || p.CNAME == nil {
@@ -11310,12 +12094,252 @@ func (p *PagesBuild) GetURL() string {
 	return *p.URL
 }
 
+// GetCAAError returns the CAAError field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetCAAError() string {
+	if p == nil || p.CAAError == nil {
+		return ""
+	}
+	return *p.CAAError
+}
+
+// GetDNSResolves returns the DNSResolves field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetDNSResolves() bool {
+	if p == nil || p.DNSResolves == nil {
+		return false
+	}
+	return *p.DNSResolves
+}
+
+// GetEnforcesHTTPS returns the EnforcesHTTPS field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetEnforcesHTTPS() bool {
+	if p == nil || p.EnforcesHTTPS == nil {
+		return false
+	}
+	return *p.EnforcesHTTPS
+}
+
+// GetHasCNAMERecord returns the HasCNAMERecord field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetHasCNAMERecord() bool {
+	if p == nil || p.HasCNAMERecord == nil {
+		return false
+	}
+	return *p.HasCNAMERecord
+}
+
+// GetHasMXRecordsPresent returns the HasMXRecordsPresent field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetHasMXRecordsPresent() bool {
+	if p == nil || p.HasMXRecordsPresent == nil {
+		return false
+	}
+	return *p.HasMXRecordsPresent
+}
+
+// GetHost returns the Host field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetHost() string {
+	if p == nil || p.Host == nil {
+		return ""
+	}
+	return *p.Host
+}
+
+// GetHTTPSError returns the HTTPSError field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetHTTPSError() string {
+	if p == nil || p.HTTPSError == nil {
+		return ""
+	}
+	return *p.HTTPSError
+}
+
+// GetIsApexDomain returns the IsApexDomain field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsApexDomain() bool {
+	if p == nil || p.IsApexDomain == nil {
+		return false
+	}
+	return *p.IsApexDomain
+}
+
+// GetIsARecord returns the IsARecord field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsARecord() bool {
+	if p == nil || p.IsARecord == nil {
+		return false
+	}
+	return *p.IsARecord
+}
+
+// GetIsCloudflareIP returns the IsCloudflareIP field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsCloudflareIP() bool {
+	if p == nil || p.IsCloudflareIP == nil {
+		return false
+	}
+	return *p.IsCloudflareIP
+}
+
+// GetIsCNAMEToFastly returns the IsCNAMEToFastly field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsCNAMEToFastly() bool {
+	if p == nil || p.IsCNAMEToFastly == nil {
+		return false
+	}
+	return *p.IsCNAMEToFastly
+}
+
+// GetIsCNAMEToGithubUserDomain returns the IsCNAMEToGithubUserDomain field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsCNAMEToGithubUserDomain() bool {
+	if p == nil || p.IsCNAMEToGithubUserDomain == nil {
+		return false
+	}
+	return *p.IsCNAMEToGithubUserDomain
+}
+
+// GetIsCNAMEToPagesDotGithubDotCom returns the IsCNAMEToPagesDotGithubDotCom field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsCNAMEToPagesDotGithubDotCom() bool {
+	if p == nil || p.IsCNAMEToPagesDotGithubDotCom == nil {
+		return false
+	}
+	return *p.IsCNAMEToPagesDotGithubDotCom
+}
+
+// GetIsFastlyIP returns the IsFastlyIP field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsFastlyIP() bool {
+	if p == nil || p.IsFastlyIP == nil {
+		return false
+	}
+	return *p.IsFastlyIP
+}
+
+// GetIsHTTPSEligible returns the IsHTTPSEligible field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsHTTPSEligible() bool {
+	if p == nil || p.IsHTTPSEligible == nil {
+		return false
+	}
+	return *p.IsHTTPSEligible
+}
+
+// GetIsNonGithubPagesIPPresent returns the IsNonGithubPagesIPPresent field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsNonGithubPagesIPPresent() bool {
+	if p == nil || p.IsNonGithubPagesIPPresent == nil {
+		return false
+	}
+	return *p.IsNonGithubPagesIPPresent
+}
+
+// GetIsOldIPAddress returns the IsOldIPAddress field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsOldIPAddress() bool {
+	if p == nil || p.IsOldIPAddress == nil {
+		return false
+	}
+	return *p.IsOldIPAddress
+}
+
+// GetIsPagesDomain returns the IsPagesDomain field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsPagesDomain() bool {
+	if p == nil || p.IsPagesDomain == nil {
+		return false
+	}
+	return *p.IsPagesDomain
+}
+
+// GetIsPointedToGithubPagesIP returns the IsPointedToGithubPagesIP field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsPointedToGithubPagesIP() bool {
+	if p == nil || p.IsPointedToGithubPagesIP == nil {
+		return false
+	}
+	return *p.IsPointedToGithubPagesIP
+}
+
+// GetIsProxied returns the IsProxied field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsProxied() bool {
+	if p == nil || p.IsProxied == nil {
+		return false
+	}
+	return *p.IsProxied
+}
+
+// GetIsServedByPages returns the IsServedByPages field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsServedByPages() bool {
+	if p == nil || p.IsServedByPages == nil {
+		return false
+	}
+	return *p.IsServedByPages
+}
+
+// GetIsValid returns the IsValid field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsValid() bool {
+	if p == nil || p.IsValid == nil {
+		return false
+	}
+	return *p.IsValid
+}
+
+// GetIsValidDomain returns the IsValidDomain field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetIsValidDomain() bool {
+	if p == nil || p.IsValidDomain == nil {
+		return false
+	}
+	return *p.IsValidDomain
+}
+
+// GetNameservers returns the Nameservers field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetNameservers() string {
+	if p == nil || p.Nameservers == nil {
+		return ""
+	}
+	return *p.Nameservers
+}
+
+// GetReason returns the Reason field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetReason() string {
+	if p == nil || p.Reason == nil {
+		return ""
+	}
+	return *p.Reason
+}
+
+// GetRespondsToHTTPS returns the RespondsToHTTPS field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetRespondsToHTTPS() bool {
+	if p == nil || p.RespondsToHTTPS == nil {
+		return false
+	}
+	return *p.RespondsToHTTPS
+}
+
+// GetShouldBeARecord returns the ShouldBeARecord field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetShouldBeARecord() bool {
+	if p == nil || p.ShouldBeARecord == nil {
+		return false
+	}
+	return *p.ShouldBeARecord
+}
+
+// GetURI returns the URI field if it's non-nil, zero value otherwise.
+func (p *PagesDomain) GetURI() string {
+	if p == nil || p.URI == nil {
+		return ""
+	}
+	return *p.URI
+}
+
 // GetMessage returns the Message field if it's non-nil, zero value otherwise.
 func (p *PagesError) GetMessage() string {
 	if p == nil || p.Message == nil {
 		return ""
 	}
-	return *p.Message
+	return *p.Message
+}
+
+// GetAltDomain returns the AltDomain field.
+func (p *PagesHealthCheckResponse) GetAltDomain() *PagesDomain {
+	if p == nil {
+		return nil
+	}
+	return p.AltDomain
+}
+
+// GetDomain returns the Domain field.
+func (p *PagesHealthCheckResponse) GetDomain() *PagesDomain {
+	if p == nil {
+		return nil
+	}
+	return p.Domain
 }
 
 // GetDescription returns the Description field if it's non-nil, zero value otherwise.
@@ -11366,6 +12390,14 @@ func (p *PageStats) GetTotalPages() int {
 	return *p.TotalPages
 }
 
+// GetBuildType returns the BuildType field if it's non-nil, zero value otherwise.
+func (p *PagesUpdate) GetBuildType() string {
+	if p == nil || p.BuildType == nil {
+		return ""
+	}
+	return *p.BuildType
+}
+
 // GetCNAME returns the CNAME field if it's non-nil, zero value otherwise.
 func (p *PagesUpdate) GetCNAME() string {
 	if p == nil || p.CNAME == nil {
@@ -11479,7 +12511,7 @@ func (p *Plan) GetName() string {
 }
 
 // GetPrivateRepos returns the PrivateRepos field if it's non-nil, zero value otherwise.
-func (p *Plan) GetPrivateRepos() int {
+func (p *Plan) GetPrivateRepos() int64 {
 	if p == nil || p.PrivateRepos == nil {
 		return 0
 	}
@@ -12254,6 +13286,22 @@ func (p *Protection) GetAllowForcePushes() *AllowForcePushes {
 	return p.AllowForcePushes
 }
 
+// GetAllowForkSyncing returns the AllowForkSyncing field.
+func (p *Protection) GetAllowForkSyncing() *AllowForkSyncing {
+	if p == nil {
+		return nil
+	}
+	return p.AllowForkSyncing
+}
+
+// GetBlockCreations returns the BlockCreations field.
+func (p *Protection) GetBlockCreations() *BlockCreations {
+	if p == nil {
+		return nil
+	}
+	return p.BlockCreations
+}
+
 // GetEnforceAdmins returns the EnforceAdmins field.
 func (p *Protection) GetEnforceAdmins() *AdminEnforcement {
 	if p == nil {
@@ -12262,6 +13310,14 @@ func (p *Protection) GetEnforceAdmins() *AdminEnforcement {
 	return p.EnforceAdmins
 }
 
+// GetLockBranch returns the LockBranch field.
+func (p *Protection) GetLockBranch() *LockBranch {
+	if p == nil {
+		return nil
+	}
+	return p.LockBranch
+}
+
 // GetRequiredConversationResolution returns the RequiredConversationResolution field.
 func (p *Protection) GetRequiredConversationResolution() *RequiredConversationResolution {
 	if p == nil {
@@ -12278,6 +13334,14 @@ func (p *Protection) GetRequiredPullRequestReviews() *PullRequestReviewsEnforcem
 	return p.RequiredPullRequestReviews
 }
 
+// GetRequiredSignatures returns the RequiredSignatures field.
+func (p *Protection) GetRequiredSignatures() *SignaturesProtectedBranch {
+	if p == nil {
+		return nil
+	}
+	return p.RequiredSignatures
+}
+
 // GetRequiredStatusChecks returns the RequiredStatusChecks field.
 func (p *Protection) GetRequiredStatusChecks() *RequiredStatusChecks {
 	if p == nil {
@@ -12302,6 +13366,14 @@ func (p *Protection) GetRestrictions() *BranchRestrictions {
 	return p.Restrictions
 }
 
+// GetURL returns the URL field if it's non-nil, zero value otherwise.
+func (p *Protection) GetURL() string {
+	if p == nil || p.URL == nil {
+		return ""
+	}
+	return *p.URL
+}
+
 // GetAdminEnforced returns the AdminEnforced field.
 func (p *ProtectionChanges) GetAdminEnforced() *AdminEnforcedChanges {
 	if p == nil {
@@ -12438,6 +13510,30 @@ func (p *ProtectionRequest) GetAllowForcePushes() bool {
 	return *p.AllowForcePushes
 }
 
+// GetAllowForkSyncing returns the AllowForkSyncing field if it's non-nil, zero value otherwise.
+func (p *ProtectionRequest) GetAllowForkSyncing() bool {
+	if p == nil || p.AllowForkSyncing == nil {
+		return false
+	}
+	return *p.AllowForkSyncing
+}
+
+// GetBlockCreations returns the BlockCreations field if it's non-nil, zero value otherwise.
+func (p *ProtectionRequest) GetBlockCreations() bool {
+	if p == nil || p.BlockCreations == nil {
+		return false
+	}
+	return *p.BlockCreations
+}
+
+// GetLockBranch returns the LockBranch field if it's non-nil, zero value otherwise.
+func (p *ProtectionRequest) GetLockBranch() bool {
+	if p == nil || p.LockBranch == nil {
+		return false
+	}
+	return *p.LockBranch
+}
+
 // GetRequiredConversationResolution returns the RequiredConversationResolution field if it's non-nil, zero value otherwise.
 func (p *ProtectionRequest) GetRequiredConversationResolution() bool {
 	if p == nil || p.RequiredConversationResolution == nil {
@@ -12615,9 +13711,9 @@ func (p *PullRequest) GetChangedFiles() int {
 }
 
 // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise.
-func (p *PullRequest) GetClosedAt() time.Time {
+func (p *PullRequest) GetClosedAt() Timestamp {
 	if p == nil || p.ClosedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *p.ClosedAt
 }
@@ -12655,9 +13751,9 @@ func (p *PullRequest) GetCommitsURL() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (p *PullRequest) GetCreatedAt() time.Time {
+func (p *PullRequest) GetCreatedAt() Timestamp {
 	if p == nil || p.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *p.CreatedAt
 }
@@ -12775,9 +13871,9 @@ func (p *PullRequest) GetMerged() bool {
 }
 
 // GetMergedAt returns the MergedAt field if it's non-nil, zero value otherwise.
-func (p *PullRequest) GetMergedAt() time.Time {
+func (p *PullRequest) GetMergedAt() Timestamp {
 	if p == nil || p.MergedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *p.MergedAt
 }
@@ -12879,9 +13975,9 @@ func (p *PullRequest) GetTitle() string {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (p *PullRequest) GetUpdatedAt() time.Time {
+func (p *PullRequest) GetUpdatedAt() Timestamp {
 	if p == nil || p.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *p.UpdatedAt
 }
@@ -13023,9 +14119,9 @@ func (p *PullRequestComment) GetCommitID() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (p *PullRequestComment) GetCreatedAt() time.Time {
+func (p *PullRequestComment) GetCreatedAt() Timestamp {
 	if p == nil || p.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *p.CreatedAt
 }
@@ -13175,9 +14271,9 @@ func (p *PullRequestComment) GetStartSide() string {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (p *PullRequestComment) GetUpdatedAt() time.Time {
+func (p *PullRequestComment) GetUpdatedAt() Timestamp {
 	if p == nil || p.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *p.UpdatedAt
 }
@@ -13431,9 +14527,9 @@ func (p *PullRequestReview) GetState() string {
 }
 
 // GetSubmittedAt returns the SubmittedAt field if it's non-nil, zero value otherwise.
-func (p *PullRequestReview) GetSubmittedAt() time.Time {
+func (p *PullRequestReview) GetSubmittedAt() Timestamp {
 	if p == nil || p.SubmittedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *p.SubmittedAt
 }
@@ -13638,6 +14734,14 @@ func (p *PullRequestReviewsEnforcementRequest) GetDismissalRestrictionsRequest()
 	return p.DismissalRestrictionsRequest
 }
 
+// GetRequireLastPushApproval returns the RequireLastPushApproval field if it's non-nil, zero value otherwise.
+func (p *PullRequestReviewsEnforcementRequest) GetRequireLastPushApproval() bool {
+	if p == nil || p.RequireLastPushApproval == nil {
+		return false
+	}
+	return *p.RequireLastPushApproval
+}
+
 // GetBypassPullRequestAllowancesRequest returns the BypassPullRequestAllowancesRequest field.
 func (p *PullRequestReviewsEnforcementUpdate) GetBypassPullRequestAllowancesRequest() *BypassPullRequestAllowancesRequest {
 	if p == nil {
@@ -13670,6 +14774,14 @@ func (p *PullRequestReviewsEnforcementUpdate) GetRequireCodeOwnerReviews() bool
 	return *p.RequireCodeOwnerReviews
 }
 
+// GetRequireLastPushApproval returns the RequireLastPushApproval field if it's non-nil, zero value otherwise.
+func (p *PullRequestReviewsEnforcementUpdate) GetRequireLastPushApproval() bool {
+	if p == nil || p.RequireLastPushApproval == nil {
+		return false
+	}
+	return *p.RequireLastPushApproval
+}
+
 // GetAction returns the Action field if it's non-nil, zero value otherwise.
 func (p *PullRequestReviewThreadEvent) GetAction() string {
 	if p == nil || p.Action == nil {
@@ -14814,6 +15926,102 @@ func (r *RepoName) GetFrom() string {
 	return *r.From
 }
 
+// GetBadgeURL returns the BadgeURL field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetBadgeURL() string {
+	if r == nil || r.BadgeURL == nil {
+		return ""
+	}
+	return *r.BadgeURL
+}
+
+// GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetCreatedAt() Timestamp {
+	if r == nil || r.CreatedAt == nil {
+		return Timestamp{}
+	}
+	return *r.CreatedAt
+}
+
+// GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetHTMLURL() string {
+	if r == nil || r.HTMLURL == nil {
+		return ""
+	}
+	return *r.HTMLURL
+}
+
+// GetID returns the ID field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetID() int64 {
+	if r == nil || r.ID == nil {
+		return 0
+	}
+	return *r.ID
+}
+
+// GetName returns the Name field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetName() string {
+	if r == nil || r.Name == nil {
+		return ""
+	}
+	return *r.Name
+}
+
+// GetNodeID returns the NodeID field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetNodeID() string {
+	if r == nil || r.NodeID == nil {
+		return ""
+	}
+	return *r.NodeID
+}
+
+// GetPath returns the Path field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetPath() string {
+	if r == nil || r.Path == nil {
+		return ""
+	}
+	return *r.Path
+}
+
+// GetSourceRepository returns the SourceRepository field.
+func (r *RepoRequiredWorkflow) GetSourceRepository() *Repository {
+	if r == nil {
+		return nil
+	}
+	return r.SourceRepository
+}
+
+// GetState returns the State field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetState() string {
+	if r == nil || r.State == nil {
+		return ""
+	}
+	return *r.State
+}
+
+// GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetUpdatedAt() Timestamp {
+	if r == nil || r.UpdatedAt == nil {
+		return Timestamp{}
+	}
+	return *r.UpdatedAt
+}
+
+// GetURL returns the URL field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflow) GetURL() string {
+	if r == nil || r.URL == nil {
+		return ""
+	}
+	return *r.URL
+}
+
+// GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise.
+func (r *RepoRequiredWorkflows) GetTotalCount() int {
+	if r == nil || r.TotalCount == nil {
+		return 0
+	}
+	return *r.TotalCount
+}
+
 // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise.
 func (r *RepositoriesSearchResult) GetIncompleteResults() bool {
 	if r == nil || r.IncompleteResults == nil {
@@ -15126,6 +16334,14 @@ func (r *Repository) GetGitURL() string {
 	return *r.GitURL
 }
 
+// GetHasDiscussions returns the HasDiscussions field if it's non-nil, zero value otherwise.
+func (r *Repository) GetHasDiscussions() bool {
+	if r == nil || r.HasDiscussions == nil {
+		return false
+	}
+	return *r.HasDiscussions
+}
+
 // GetHasDownloads returns the HasDownloads field if it's non-nil, zero value otherwise.
 func (r *Repository) GetHasDownloads() bool {
 	if r == nil || r.HasDownloads == nil {
@@ -15638,6 +16854,22 @@ func (r *Repository) GetWatchersCount() int {
 	return *r.WatchersCount
 }
 
+// GetWebCommitSignoffRequired returns the WebCommitSignoffRequired field if it's non-nil, zero value otherwise.
+func (r *Repository) GetWebCommitSignoffRequired() bool {
+	if r == nil || r.WebCommitSignoffRequired == nil {
+		return false
+	}
+	return *r.WebCommitSignoffRequired
+}
+
+// GetAccessLevel returns the AccessLevel field if it's non-nil, zero value otherwise.
+func (r *RepositoryActionsAccessLevel) GetAccessLevel() string {
+	if r == nil || r.AccessLevel == nil {
+		return ""
+	}
+	return *r.AccessLevel
+}
+
 // GetAdvancedSecurityCommitters returns the AdvancedSecurityCommitters field if it's non-nil, zero value otherwise.
 func (r *RepositoryActiveCommitters) GetAdvancedSecurityCommitters() int {
 	if r == nil || r.AdvancedSecurityCommitters == nil {
@@ -15671,9 +16903,9 @@ func (r *RepositoryComment) GetCommitID() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (r *RepositoryComment) GetCreatedAt() time.Time {
+func (r *RepositoryComment) GetCreatedAt() Timestamp {
 	if r == nil || r.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *r.CreatedAt
 }
@@ -15727,9 +16959,9 @@ func (r *RepositoryComment) GetReactions() *Reactions {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (r *RepositoryComment) GetUpdatedAt() time.Time {
+func (r *RepositoryComment) GetUpdatedAt() Timestamp {
 	if r == nil || r.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *r.UpdatedAt
 }
@@ -16358,6 +17590,14 @@ func (r *RepositoryRelease) GetID() int64 {
 	return *r.ID
 }
 
+// GetMakeLatest returns the MakeLatest field if it's non-nil, zero value otherwise.
+func (r *RepositoryRelease) GetMakeLatest() string {
+	if r == nil || r.MakeLatest == nil {
+		return ""
+	}
+	return *r.MakeLatest
+}
+
 // GetName returns the Name field if it's non-nil, zero value otherwise.
 func (r *RepositoryRelease) GetName() string {
 	if r == nil || r.Name == nil {
@@ -16671,9 +17911,9 @@ func (r *RepoStatus) GetContext() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (r *RepoStatus) GetCreatedAt() time.Time {
+func (r *RepoStatus) GetCreatedAt() Timestamp {
 	if r == nil || r.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *r.CreatedAt
 }
@@ -16727,9 +17967,9 @@ func (r *RepoStatus) GetTargetURL() string {
 }
 
 // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise.
-func (r *RepoStatus) GetUpdatedAt() time.Time {
+func (r *RepoStatus) GetUpdatedAt() Timestamp {
 	if r == nil || r.UpdatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *r.UpdatedAt
 }
@@ -16782,6 +18022,22 @@ func (r *RequiredStatusCheck) GetAppID() int64 {
 	return *r.AppID
 }
 
+// GetContextsURL returns the ContextsURL field if it's non-nil, zero value otherwise.
+func (r *RequiredStatusChecks) GetContextsURL() string {
+	if r == nil || r.ContextsURL == nil {
+		return ""
+	}
+	return *r.ContextsURL
+}
+
+// GetURL returns the URL field if it's non-nil, zero value otherwise.
+func (r *RequiredStatusChecks) GetURL() string {
+	if r == nil || r.URL == nil {
+		return ""
+	}
+	return *r.URL
+}
+
 // GetFrom returns the From field if it's non-nil, zero value otherwise.
 func (r *RequiredStatusChecksEnforcementLevelChanges) GetFrom() string {
 	if r == nil || r.From == nil {
@@ -16798,6 +18054,14 @@ func (r *RequiredStatusChecksRequest) GetStrict() bool {
 	return *r.Strict
 }
 
+// GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise.
+func (r *RequiredWorkflowSelectedRepos) GetTotalCount() int {
+	if r == nil || r.TotalCount == nil {
+		return 0
+	}
+	return *r.TotalCount
+}
+
 // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise.
 func (r *ReviewersRequest) GetNodeID() string {
 	if r == nil || r.NodeID == nil {
@@ -18991,9 +20255,9 @@ func (t *Timeline) GetCommitURL() string {
 }
 
 // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
-func (t *Timeline) GetCreatedAt() time.Time {
+func (t *Timeline) GetCreatedAt() Timestamp {
 	if t == nil || t.CreatedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *t.CreatedAt
 }
@@ -19054,6 +20318,14 @@ func (t *Timeline) GetRename() *Rename {
 	return t.Rename
 }
 
+// GetRequestedTeam returns the RequestedTeam field.
+func (t *Timeline) GetRequestedTeam() *Team {
+	if t == nil {
+		return nil
+	}
+	return t.RequestedTeam
+}
+
 // GetRequester returns the Requester field.
 func (t *Timeline) GetRequester() *User {
 	if t == nil {
@@ -19095,9 +20367,9 @@ func (t *Timeline) GetState() string {
 }
 
 // GetSubmittedAt returns the SubmittedAt field if it's non-nil, zero value otherwise.
-func (t *Timeline) GetSubmittedAt() time.Time {
+func (t *Timeline) GetSubmittedAt() Timestamp {
 	if t == nil || t.SubmittedAt == nil {
-		return time.Time{}
+		return Timestamp{}
 	}
 	return *t.SubmittedAt
 }
@@ -19703,7 +20975,7 @@ func (u *User) GetOrganizationsURL() string {
 }
 
 // GetOwnedPrivateRepos returns the OwnedPrivateRepos field if it's non-nil, zero value otherwise.
-func (u *User) GetOwnedPrivateRepos() int {
+func (u *User) GetOwnedPrivateRepos() int64 {
 	if u == nil || u.OwnedPrivateRepos == nil {
 		return 0
 	}
@@ -19807,7 +21079,7 @@ func (u *User) GetSuspendedAt() Timestamp {
 }
 
 // GetTotalPrivateRepos returns the TotalPrivateRepos field if it's non-nil, zero value otherwise.
-func (u *User) GetTotalPrivateRepos() int {
+func (u *User) GetTotalPrivateRepos() int64 {
 	if u == nil || u.TotalPrivateRepos == nil {
 		return 0
 	}
@@ -20510,30 +21782,6 @@ func (w *WorkflowDispatchEvent) GetWorkflow() string {
 	return *w.Workflow
 }
 
-// GetMacOS returns the MacOS field.
-func (w *WorkflowEnvironment) GetMacOS() *WorkflowBill {
-	if w == nil {
-		return nil
-	}
-	return w.MacOS
-}
-
-// GetUbuntu returns the Ubuntu field.
-func (w *WorkflowEnvironment) GetUbuntu() *WorkflowBill {
-	if w == nil {
-		return nil
-	}
-	return w.Ubuntu
-}
-
-// GetWindows returns the Windows field.
-func (w *WorkflowEnvironment) GetWindows() *WorkflowBill {
-	if w == nil {
-		return nil
-	}
-	return w.Windows
-}
-
 // GetCheckRunURL returns the CheckRunURL field if it's non-nil, zero value otherwise.
 func (w *WorkflowJob) GetCheckRunURL() string {
 	if w == nil || w.CheckRunURL == nil {
@@ -20558,6 +21806,22 @@ func (w *WorkflowJob) GetConclusion() string {
 	return *w.Conclusion
 }
 
+// GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
+func (w *WorkflowJob) GetCreatedAt() Timestamp {
+	if w == nil || w.CreatedAt == nil {
+		return Timestamp{}
+	}
+	return *w.CreatedAt
+}
+
+// GetHeadBranch returns the HeadBranch field if it's non-nil, zero value otherwise.
+func (w *WorkflowJob) GetHeadBranch() string {
+	if w == nil || w.HeadBranch == nil {
+		return ""
+	}
+	return *w.HeadBranch
+}
+
 // GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise.
 func (w *WorkflowJob) GetHeadSHA() string {
 	if w == nil || w.HeadSHA == nil {
@@ -20598,6 +21862,14 @@ func (w *WorkflowJob) GetNodeID() string {
 	return *w.NodeID
 }
 
+// GetRunAttempt returns the RunAttempt field if it's non-nil, zero value otherwise.
+func (w *WorkflowJob) GetRunAttempt() int64 {
+	if w == nil || w.RunAttempt == nil {
+		return 0
+	}
+	return *w.RunAttempt
+}
+
 // GetRunID returns the RunID field if it's non-nil, zero value otherwise.
 func (w *WorkflowJob) GetRunID() int64 {
 	if w == nil || w.RunID == nil {
@@ -20670,6 +21942,14 @@ func (w *WorkflowJob) GetURL() string {
 	return *w.URL
 }
 
+// GetWorkflowName returns the WorkflowName field if it's non-nil, zero value otherwise.
+func (w *WorkflowJob) GetWorkflowName() string {
+	if w == nil || w.WorkflowName == nil {
+		return ""
+	}
+	return *w.WorkflowName
+}
+
 // GetAction returns the Action field if it's non-nil, zero value otherwise.
 func (w *WorkflowJobEvent) GetAction() string {
 	if w == nil || w.Action == nil {
@@ -20982,30 +22262,6 @@ func (w *WorkflowRunBill) GetTotalMS() int64 {
 	return *w.TotalMS
 }
 
-// GetMacOS returns the MacOS field.
-func (w *WorkflowRunEnvironment) GetMacOS() *WorkflowRunBill {
-	if w == nil {
-		return nil
-	}
-	return w.MacOS
-}
-
-// GetUbuntu returns the Ubuntu field.
-func (w *WorkflowRunEnvironment) GetUbuntu() *WorkflowRunBill {
-	if w == nil {
-		return nil
-	}
-	return w.Ubuntu
-}
-
-// GetWindows returns the Windows field.
-func (w *WorkflowRunEnvironment) GetWindows() *WorkflowRunBill {
-	if w == nil {
-		return nil
-	}
-	return w.Windows
-}
-
 // GetAction returns the Action field if it's non-nil, zero value otherwise.
 func (w *WorkflowRunEvent) GetAction() string {
 	if w == nil || w.Action == nil {
@@ -21087,7 +22343,7 @@ func (w *WorkflowRuns) GetTotalCount() int {
 }
 
 // GetBillable returns the Billable field.
-func (w *WorkflowRunUsage) GetBillable() *WorkflowRunEnvironment {
+func (w *WorkflowRunUsage) GetBillable() *WorkflowRunBillMap {
 	if w == nil {
 		return nil
 	}
@@ -21111,7 +22367,7 @@ func (w *Workflows) GetTotalCount() int {
 }
 
 // GetBillable returns the Billable field.
-func (w *WorkflowUsage) GetBillable() *WorkflowEnvironment {
+func (w *WorkflowUsage) GetBillable() *WorkflowBillMap {
 	if w == nil {
 		return nil
 	}
diff --git a/github/github-accessors_test.go b/github/github-accessors_test.go
index 78e8628..0a5d3a6 100644
--- a/github/github-accessors_test.go
+++ b/github/github-accessors_test.go
@@ -45,6 +45,116 @@ func TestActionsAllowed_GetVerifiedAllowed(tt *testing.T) {
 	a.GetVerifiedAllowed()
 }
 
+func TestActionsCache_GetCreatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	a := &ActionsCache{CreatedAt: &zeroValue}
+	a.GetCreatedAt()
+	a = &ActionsCache{}
+	a.GetCreatedAt()
+	a = nil
+	a.GetCreatedAt()
+}
+
+func TestActionsCache_GetID(tt *testing.T) {
+	var zeroValue int64
+	a := &ActionsCache{ID: &zeroValue}
+	a.GetID()
+	a = &ActionsCache{}
+	a.GetID()
+	a = nil
+	a.GetID()
+}
+
+func TestActionsCache_GetKey(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsCache{Key: &zeroValue}
+	a.GetKey()
+	a = &ActionsCache{}
+	a.GetKey()
+	a = nil
+	a.GetKey()
+}
+
+func TestActionsCache_GetLastAccessedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	a := &ActionsCache{LastAccessedAt: &zeroValue}
+	a.GetLastAccessedAt()
+	a = &ActionsCache{}
+	a.GetLastAccessedAt()
+	a = nil
+	a.GetLastAccessedAt()
+}
+
+func TestActionsCache_GetRef(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsCache{Ref: &zeroValue}
+	a.GetRef()
+	a = &ActionsCache{}
+	a.GetRef()
+	a = nil
+	a.GetRef()
+}
+
+func TestActionsCache_GetSizeInBytes(tt *testing.T) {
+	var zeroValue int64
+	a := &ActionsCache{SizeInBytes: &zeroValue}
+	a.GetSizeInBytes()
+	a = &ActionsCache{}
+	a.GetSizeInBytes()
+	a = nil
+	a.GetSizeInBytes()
+}
+
+func TestActionsCache_GetVersion(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsCache{Version: &zeroValue}
+	a.GetVersion()
+	a = &ActionsCache{}
+	a.GetVersion()
+	a = nil
+	a.GetVersion()
+}
+
+func TestActionsCacheListOptions_GetDirection(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsCacheListOptions{Direction: &zeroValue}
+	a.GetDirection()
+	a = &ActionsCacheListOptions{}
+	a.GetDirection()
+	a = nil
+	a.GetDirection()
+}
+
+func TestActionsCacheListOptions_GetKey(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsCacheListOptions{Key: &zeroValue}
+	a.GetKey()
+	a = &ActionsCacheListOptions{}
+	a.GetKey()
+	a = nil
+	a.GetKey()
+}
+
+func TestActionsCacheListOptions_GetRef(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsCacheListOptions{Ref: &zeroValue}
+	a.GetRef()
+	a = &ActionsCacheListOptions{}
+	a.GetRef()
+	a = nil
+	a.GetRef()
+}
+
+func TestActionsCacheListOptions_GetSort(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsCacheListOptions{Sort: &zeroValue}
+	a.GetSort()
+	a = &ActionsCacheListOptions{}
+	a.GetSort()
+	a = nil
+	a.GetSort()
+}
+
 func TestActionsPermissions_GetAllowedActions(tt *testing.T) {
 	var zeroValue string
 	a := &ActionsPermissions{AllowedActions: &zeroValue}
@@ -105,6 +215,53 @@ func TestActionsPermissionsRepository_GetSelectedActionsURL(tt *testing.T) {
 	a.GetSelectedActionsURL()
 }
 
+func TestActionsVariable_GetCreatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	a := &ActionsVariable{CreatedAt: &zeroValue}
+	a.GetCreatedAt()
+	a = &ActionsVariable{}
+	a.GetCreatedAt()
+	a = nil
+	a.GetCreatedAt()
+}
+
+func TestActionsVariable_GetSelectedRepositoriesURL(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsVariable{SelectedRepositoriesURL: &zeroValue}
+	a.GetSelectedRepositoriesURL()
+	a = &ActionsVariable{}
+	a.GetSelectedRepositoriesURL()
+	a = nil
+	a.GetSelectedRepositoriesURL()
+}
+
+func TestActionsVariable_GetSelectedRepositoryIDs(tt *testing.T) {
+	a := &ActionsVariable{}
+	a.GetSelectedRepositoryIDs()
+	a = nil
+	a.GetSelectedRepositoryIDs()
+}
+
+func TestActionsVariable_GetUpdatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	a := &ActionsVariable{UpdatedAt: &zeroValue}
+	a.GetUpdatedAt()
+	a = &ActionsVariable{}
+	a.GetUpdatedAt()
+	a = nil
+	a.GetUpdatedAt()
+}
+
+func TestActionsVariable_GetVisibility(tt *testing.T) {
+	var zeroValue string
+	a := &ActionsVariable{Visibility: &zeroValue}
+	a.GetVisibility()
+	a = &ActionsVariable{}
+	a.GetVisibility()
+	a = nil
+	a.GetVisibility()
+}
+
 func TestAdminEnforcedChanges_GetFrom(tt *testing.T) {
 	var zeroValue bool
 	a := &AdminEnforcedChanges{From: &zeroValue}
@@ -528,6 +685,16 @@ func TestAllowDeletionsEnforcementLevelChanges_GetFrom(tt *testing.T) {
 	a.GetFrom()
 }
 
+func TestAllowForkSyncing_GetEnabled(tt *testing.T) {
+	var zeroValue bool
+	a := &AllowForkSyncing{Enabled: &zeroValue}
+	a.GetEnabled()
+	a = &AllowForkSyncing{}
+	a.GetEnabled()
+	a = nil
+	a.GetEnabled()
+}
+
 func TestAnalysesListOptions_GetRef(tt *testing.T) {
 	var zeroValue string
 	a := &AnalysesListOptions{Ref: &zeroValue}
@@ -618,6 +785,16 @@ func TestApp_GetID(tt *testing.T) {
 	a.GetID()
 }
 
+func TestApp_GetInstallationsCount(tt *testing.T) {
+	var zeroValue int
+	a := &App{InstallationsCount: &zeroValue}
+	a.GetInstallationsCount()
+	a = &App{}
+	a.GetInstallationsCount()
+	a = nil
+	a.GetInstallationsCount()
+}
+
 func TestApp_GetName(tt *testing.T) {
 	var zeroValue string
 	a := &App{Name: &zeroValue}
@@ -889,6 +1066,33 @@ func TestArtifact_GetSizeInBytes(tt *testing.T) {
 	a.GetSizeInBytes()
 }
 
+func TestArtifact_GetUpdatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	a := &Artifact{UpdatedAt: &zeroValue}
+	a.GetUpdatedAt()
+	a = &Artifact{}
+	a.GetUpdatedAt()
+	a = nil
+	a.GetUpdatedAt()
+}
+
+func TestArtifact_GetURL(tt *testing.T) {
+	var zeroValue string
+	a := &Artifact{URL: &zeroValue}
+	a.GetURL()
+	a = &Artifact{}
+	a.GetURL()
+	a = nil
+	a.GetURL()
+}
+
+func TestArtifact_GetWorkflowRun(tt *testing.T) {
+	a := &Artifact{}
+	a.GetWorkflowRun()
+	a = nil
+	a.GetWorkflowRun()
+}
+
 func TestArtifactList_GetTotalCount(tt *testing.T) {
 	var zeroValue int64
 	a := &ArtifactList{TotalCount: &zeroValue}
@@ -899,6 +1103,56 @@ func TestArtifactList_GetTotalCount(tt *testing.T) {
 	a.GetTotalCount()
 }
 
+func TestArtifactWorkflowRun_GetHeadBranch(tt *testing.T) {
+	var zeroValue string
+	a := &ArtifactWorkflowRun{HeadBranch: &zeroValue}
+	a.GetHeadBranch()
+	a = &ArtifactWorkflowRun{}
+	a.GetHeadBranch()
+	a = nil
+	a.GetHeadBranch()
+}
+
+func TestArtifactWorkflowRun_GetHeadRepositoryID(tt *testing.T) {
+	var zeroValue int64
+	a := &ArtifactWorkflowRun{HeadRepositoryID: &zeroValue}
+	a.GetHeadRepositoryID()
+	a = &ArtifactWorkflowRun{}
+	a.GetHeadRepositoryID()
+	a = nil
+	a.GetHeadRepositoryID()
+}
+
+func TestArtifactWorkflowRun_GetHeadSHA(tt *testing.T) {
+	var zeroValue string
+	a := &ArtifactWorkflowRun{HeadSHA: &zeroValue}
+	a.GetHeadSHA()
+	a = &ArtifactWorkflowRun{}
+	a.GetHeadSHA()
+	a = nil
+	a.GetHeadSHA()
+}
+
+func TestArtifactWorkflowRun_GetID(tt *testing.T) {
+	var zeroValue int64
+	a := &ArtifactWorkflowRun{ID: &zeroValue}
+	a.GetID()
+	a = &ArtifactWorkflowRun{}
+	a.GetID()
+	a = nil
+	a.GetID()
+}
+
+func TestArtifactWorkflowRun_GetRepositoryID(tt *testing.T) {
+	var zeroValue int64
+	a := &ArtifactWorkflowRun{RepositoryID: &zeroValue}
+	a.GetRepositoryID()
+	a = &ArtifactWorkflowRun{}
+	a.GetRepositoryID()
+	a = nil
+	a.GetRepositoryID()
+}
+
 func TestAttachment_GetBody(tt *testing.T) {
 	var zeroValue string
 	a := &Attachment{Body: &zeroValue}
@@ -1203,6 +1457,16 @@ func TestAuditEntry_GetName(tt *testing.T) {
 	a.GetName()
 }
 
+func TestAuditEntry_GetOldPermission(tt *testing.T) {
+	var zeroValue string
+	a := &AuditEntry{OldPermission: &zeroValue}
+	a.GetOldPermission()
+	a = &AuditEntry{}
+	a.GetOldPermission()
+	a = nil
+	a.GetOldPermission()
+}
+
 func TestAuditEntry_GetOldUser(tt *testing.T) {
 	var zeroValue string
 	a := &AuditEntry{OldUser: &zeroValue}
@@ -1233,6 +1497,16 @@ func TestAuditEntry_GetOrg(tt *testing.T) {
 	a.GetOrg()
 }
 
+func TestAuditEntry_GetPermission(tt *testing.T) {
+	var zeroValue string
+	a := &AuditEntry{Permission: &zeroValue}
+	a.GetPermission()
+	a = &AuditEntry{}
+	a.GetPermission()
+	a = nil
+	a.GetPermission()
+}
+
 func TestAuditEntry_GetPreviousVisibility(tt *testing.T) {
 	var zeroValue string
 	a := &AuditEntry{PreviousVisibility: &zeroValue}
@@ -1857,6 +2131,16 @@ func TestBlob_GetURL(tt *testing.T) {
 	b.GetURL()
 }
 
+func TestBlockCreations_GetEnabled(tt *testing.T) {
+	var zeroValue bool
+	b := &BlockCreations{Enabled: &zeroValue}
+	b.GetEnabled()
+	b = &BlockCreations{}
+	b.GetEnabled()
+	b = nil
+	b.GetEnabled()
+}
+
 func TestBranch_GetCommit(tt *testing.T) {
 	b := &Branch{}
 	b.GetCommit()
@@ -2890,6 +3174,13 @@ func TestCodeScanningAlertEvent_GetCommitOID(tt *testing.T) {
 	c.GetCommitOID()
 }
 
+func TestCodeScanningAlertEvent_GetInstallation(tt *testing.T) {
+	c := &CodeScanningAlertEvent{}
+	c.GetInstallation()
+	c = nil
+	c.GetInstallation()
+}
+
 func TestCodeScanningAlertEvent_GetOrg(tt *testing.T) {
 	c := &CodeScanningAlertEvent{}
 	c.GetOrg()
@@ -2921,6 +3212,26 @@ func TestCodeScanningAlertEvent_GetSender(tt *testing.T) {
 	c.GetSender()
 }
 
+func TestCodeScanningAlertState_GetDismissedComment(tt *testing.T) {
+	var zeroValue string
+	c := &CodeScanningAlertState{DismissedComment: &zeroValue}
+	c.GetDismissedComment()
+	c = &CodeScanningAlertState{}
+	c.GetDismissedComment()
+	c = nil
+	c.GetDismissedComment()
+}
+
+func TestCodeScanningAlertState_GetDismissedReason(tt *testing.T) {
+	var zeroValue string
+	c := &CodeScanningAlertState{DismissedReason: &zeroValue}
+	c.GetDismissedReason()
+	c = &CodeScanningAlertState{}
+	c.GetDismissedReason()
+	c = nil
+	c.GetDismissedReason()
+}
+
 func TestCodeSearchResult_GetIncompleteResults(tt *testing.T) {
 	var zeroValue bool
 	c := &CodeSearchResult{IncompleteResults: &zeroValue}
@@ -3073,7 +3384,7 @@ func TestCombinedStatus_GetTotalCount(tt *testing.T) {
 }
 
 func TestComment_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	c := &Comment{CreatedAt: &zeroValue}
 	c.GetCreatedAt()
 	c = &Comment{}
@@ -3082,6 +3393,130 @@ func TestComment_GetCreatedAt(tt *testing.T) {
 	c.GetCreatedAt()
 }
 
+func TestCommentDiscussion_GetAuthorAssociation(tt *testing.T) {
+	var zeroValue string
+	c := &CommentDiscussion{AuthorAssociation: &zeroValue}
+	c.GetAuthorAssociation()
+	c = &CommentDiscussion{}
+	c.GetAuthorAssociation()
+	c = nil
+	c.GetAuthorAssociation()
+}
+
+func TestCommentDiscussion_GetBody(tt *testing.T) {
+	var zeroValue string
+	c := &CommentDiscussion{Body: &zeroValue}
+	c.GetBody()
+	c = &CommentDiscussion{}
+	c.GetBody()
+	c = nil
+	c.GetBody()
+}
+
+func TestCommentDiscussion_GetChildCommentCount(tt *testing.T) {
+	var zeroValue int
+	c := &CommentDiscussion{ChildCommentCount: &zeroValue}
+	c.GetChildCommentCount()
+	c = &CommentDiscussion{}
+	c.GetChildCommentCount()
+	c = nil
+	c.GetChildCommentCount()
+}
+
+func TestCommentDiscussion_GetCreatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	c := &CommentDiscussion{CreatedAt: &zeroValue}
+	c.GetCreatedAt()
+	c = &CommentDiscussion{}
+	c.GetCreatedAt()
+	c = nil
+	c.GetCreatedAt()
+}
+
+func TestCommentDiscussion_GetDiscussionID(tt *testing.T) {
+	var zeroValue int64
+	c := &CommentDiscussion{DiscussionID: &zeroValue}
+	c.GetDiscussionID()
+	c = &CommentDiscussion{}
+	c.GetDiscussionID()
+	c = nil
+	c.GetDiscussionID()
+}
+
+func TestCommentDiscussion_GetHTMLURL(tt *testing.T) {
+	var zeroValue string
+	c := &CommentDiscussion{HTMLURL: &zeroValue}
+	c.GetHTMLURL()
+	c = &CommentDiscussion{}
+	c.GetHTMLURL()
+	c = nil
+	c.GetHTMLURL()
+}
+
+func TestCommentDiscussion_GetID(tt *testing.T) {
+	var zeroValue int64
+	c := &CommentDiscussion{ID: &zeroValue}
+	c.GetID()
+	c = &CommentDiscussion{}
+	c.GetID()
+	c = nil
+	c.GetID()
+}
+
+func TestCommentDiscussion_GetNodeID(tt *testing.T) {
+	var zeroValue string
+	c := &CommentDiscussion{NodeID: &zeroValue}
+	c.GetNodeID()
+	c = &CommentDiscussion{}
+	c.GetNodeID()
+	c = nil
+	c.GetNodeID()
+}
+
+func TestCommentDiscussion_GetParentID(tt *testing.T) {
+	var zeroValue int64
+	c := &CommentDiscussion{ParentID: &zeroValue}
+	c.GetParentID()
+	c = &CommentDiscussion{}
+	c.GetParentID()
+	c = nil
+	c.GetParentID()
+}
+
+func TestCommentDiscussion_GetReactions(tt *testing.T) {
+	c := &CommentDiscussion{}
+	c.GetReactions()
+	c = nil
+	c.GetReactions()
+}
+
+func TestCommentDiscussion_GetRepositoryURL(tt *testing.T) {
+	var zeroValue string
+	c := &CommentDiscussion{RepositoryURL: &zeroValue}
+	c.GetRepositoryURL()
+	c = &CommentDiscussion{}
+	c.GetRepositoryURL()
+	c = nil
+	c.GetRepositoryURL()
+}
+
+func TestCommentDiscussion_GetUpdatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	c := &CommentDiscussion{UpdatedAt: &zeroValue}
+	c.GetUpdatedAt()
+	c = &CommentDiscussion{}
+	c.GetUpdatedAt()
+	c = nil
+	c.GetUpdatedAt()
+}
+
+func TestCommentDiscussion_GetUser(tt *testing.T) {
+	c := &CommentDiscussion{}
+	c.GetUser()
+	c = nil
+	c.GetUser()
+}
+
 func TestCommentStats_GetTotalCommitComments(tt *testing.T) {
 	var zeroValue int
 	c := &CommentStats{TotalCommitComments: &zeroValue}
@@ -3218,7 +3653,7 @@ func TestCommit_GetVerification(tt *testing.T) {
 }
 
 func TestCommitAuthor_GetDate(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	c := &CommitAuthor{Date: &zeroValue}
 	c.GetDate()
 	c = &CommitAuthor{}
@@ -3731,7 +4166,7 @@ func TestCommunityHealthMetrics_GetHealthPercentage(tt *testing.T) {
 }
 
 func TestCommunityHealthMetrics_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	c := &CommunityHealthMetrics{UpdatedAt: &zeroValue}
 	c.GetUpdatedAt()
 	c = &CommunityHealthMetrics{}
@@ -4300,10 +4735,20 @@ func TestCreateRunnerGroupRequest_GetVisibility(tt *testing.T) {
 	c.GetVisibility()
 }
 
-func TestCreateUpdateEnvironment_GetDeploymentBranchPolicy(tt *testing.T) {
-	c := &CreateUpdateEnvironment{}
-	c.GetDeploymentBranchPolicy()
-	c = nil
+func TestCreateUpdateEnvironment_GetCanAdminsBypass(tt *testing.T) {
+	var zeroValue bool
+	c := &CreateUpdateEnvironment{CanAdminsBypass: &zeroValue}
+	c.GetCanAdminsBypass()
+	c = &CreateUpdateEnvironment{}
+	c.GetCanAdminsBypass()
+	c = nil
+	c.GetCanAdminsBypass()
+}
+
+func TestCreateUpdateEnvironment_GetDeploymentBranchPolicy(tt *testing.T) {
+	c := &CreateUpdateEnvironment{}
+	c.GetDeploymentBranchPolicy()
+	c = nil
 	c.GetDeploymentBranchPolicy()
 }
 
@@ -4317,6 +4762,43 @@ func TestCreateUpdateEnvironment_GetWaitTimer(tt *testing.T) {
 	c.GetWaitTimer()
 }
 
+func TestCreateUpdateRequiredWorkflowOptions_GetRepositoryID(tt *testing.T) {
+	var zeroValue int64
+	c := &CreateUpdateRequiredWorkflowOptions{RepositoryID: &zeroValue}
+	c.GetRepositoryID()
+	c = &CreateUpdateRequiredWorkflowOptions{}
+	c.GetRepositoryID()
+	c = nil
+	c.GetRepositoryID()
+}
+
+func TestCreateUpdateRequiredWorkflowOptions_GetScope(tt *testing.T) {
+	var zeroValue string
+	c := &CreateUpdateRequiredWorkflowOptions{Scope: &zeroValue}
+	c.GetScope()
+	c = &CreateUpdateRequiredWorkflowOptions{}
+	c.GetScope()
+	c = nil
+	c.GetScope()
+}
+
+func TestCreateUpdateRequiredWorkflowOptions_GetSelectedRepositoryIDs(tt *testing.T) {
+	c := &CreateUpdateRequiredWorkflowOptions{}
+	c.GetSelectedRepositoryIDs()
+	c = nil
+	c.GetSelectedRepositoryIDs()
+}
+
+func TestCreateUpdateRequiredWorkflowOptions_GetWorkflowFilePath(tt *testing.T) {
+	var zeroValue string
+	c := &CreateUpdateRequiredWorkflowOptions{WorkflowFilePath: &zeroValue}
+	c.GetWorkflowFilePath()
+	c = &CreateUpdateRequiredWorkflowOptions{}
+	c.GetWorkflowFilePath()
+	c = nil
+	c.GetWorkflowFilePath()
+}
+
 func TestCreateUserProjectOptions_GetBody(tt *testing.T) {
 	var zeroValue string
 	c := &CreateUserProjectOptions{Body: &zeroValue}
@@ -4832,6 +5314,56 @@ func TestDeployment_GetURL(tt *testing.T) {
 	d.GetURL()
 }
 
+func TestDeploymentBranchPolicy_GetID(tt *testing.T) {
+	var zeroValue int64
+	d := &DeploymentBranchPolicy{ID: &zeroValue}
+	d.GetID()
+	d = &DeploymentBranchPolicy{}
+	d.GetID()
+	d = nil
+	d.GetID()
+}
+
+func TestDeploymentBranchPolicy_GetName(tt *testing.T) {
+	var zeroValue string
+	d := &DeploymentBranchPolicy{Name: &zeroValue}
+	d.GetName()
+	d = &DeploymentBranchPolicy{}
+	d.GetName()
+	d = nil
+	d.GetName()
+}
+
+func TestDeploymentBranchPolicy_GetNodeID(tt *testing.T) {
+	var zeroValue string
+	d := &DeploymentBranchPolicy{NodeID: &zeroValue}
+	d.GetNodeID()
+	d = &DeploymentBranchPolicy{}
+	d.GetNodeID()
+	d = nil
+	d.GetNodeID()
+}
+
+func TestDeploymentBranchPolicyRequest_GetName(tt *testing.T) {
+	var zeroValue string
+	d := &DeploymentBranchPolicyRequest{Name: &zeroValue}
+	d.GetName()
+	d = &DeploymentBranchPolicyRequest{}
+	d.GetName()
+	d = nil
+	d.GetName()
+}
+
+func TestDeploymentBranchPolicyResponse_GetTotalCount(tt *testing.T) {
+	var zeroValue int
+	d := &DeploymentBranchPolicyResponse{TotalCount: &zeroValue}
+	d.GetTotalCount()
+	d = &DeploymentBranchPolicyResponse{}
+	d.GetTotalCount()
+	d = nil
+	d.GetTotalCount()
+}
+
 func TestDeploymentEvent_GetDeployment(tt *testing.T) {
 	d := &DeploymentEvent{}
 	d.GetDeployment()
@@ -5580,6 +6112,58 @@ func TestDiscussionComment_GetURL(tt *testing.T) {
 	d.GetURL()
 }
 
+func TestDiscussionCommentEvent_GetAction(tt *testing.T) {
+	var zeroValue string
+	d := &DiscussionCommentEvent{Action: &zeroValue}
+	d.GetAction()
+	d = &DiscussionCommentEvent{}
+	d.GetAction()
+	d = nil
+	d.GetAction()
+}
+
+func TestDiscussionCommentEvent_GetComment(tt *testing.T) {
+	d := &DiscussionCommentEvent{}
+	d.GetComment()
+	d = nil
+	d.GetComment()
+}
+
+func TestDiscussionCommentEvent_GetDiscussion(tt *testing.T) {
+	d := &DiscussionCommentEvent{}
+	d.GetDiscussion()
+	d = nil
+	d.GetDiscussion()
+}
+
+func TestDiscussionCommentEvent_GetInstallation(tt *testing.T) {
+	d := &DiscussionCommentEvent{}
+	d.GetInstallation()
+	d = nil
+	d.GetInstallation()
+}
+
+func TestDiscussionCommentEvent_GetOrg(tt *testing.T) {
+	d := &DiscussionCommentEvent{}
+	d.GetOrg()
+	d = nil
+	d.GetOrg()
+}
+
+func TestDiscussionCommentEvent_GetRepo(tt *testing.T) {
+	d := &DiscussionCommentEvent{}
+	d.GetRepo()
+	d = nil
+	d.GetRepo()
+}
+
+func TestDiscussionCommentEvent_GetSender(tt *testing.T) {
+	d := &DiscussionCommentEvent{}
+	d.GetSender()
+	d = nil
+	d.GetSender()
+}
+
 func TestDiscussionEvent_GetAction(tt *testing.T) {
 	var zeroValue string
 	d := &DiscussionEvent{Action: &zeroValue}
@@ -5823,6 +6407,13 @@ func TestEditChange_GetBody(tt *testing.T) {
 	e.GetBody()
 }
 
+func TestEditChange_GetOwner(tt *testing.T) {
+	e := &EditChange{}
+	e.GetOwner()
+	e = nil
+	e.GetOwner()
+}
+
 func TestEditChange_GetRepo(tt *testing.T) {
 	e := &EditChange{}
 	e.GetRepo()
@@ -5837,6 +6428,13 @@ func TestEditChange_GetTitle(tt *testing.T) {
 	e.GetTitle()
 }
 
+func TestEditOwner_GetOwnerInfo(tt *testing.T) {
+	e := &EditOwner{}
+	e.GetOwnerInfo()
+	e = nil
+	e.GetOwnerInfo()
+}
+
 func TestEditRef_GetFrom(tt *testing.T) {
 	var zeroValue string
 	e := &EditRef{From: &zeroValue}
@@ -5974,6 +6572,56 @@ func TestEnterprise_GetWebsiteURL(tt *testing.T) {
 	e.GetWebsiteURL()
 }
 
+func TestEnterpriseSecurityAnalysisSettings_GetAdvancedSecurityEnabledForNewRepositories(tt *testing.T) {
+	var zeroValue bool
+	e := &EnterpriseSecurityAnalysisSettings{AdvancedSecurityEnabledForNewRepositories: &zeroValue}
+	e.GetAdvancedSecurityEnabledForNewRepositories()
+	e = &EnterpriseSecurityAnalysisSettings{}
+	e.GetAdvancedSecurityEnabledForNewRepositories()
+	e = nil
+	e.GetAdvancedSecurityEnabledForNewRepositories()
+}
+
+func TestEnterpriseSecurityAnalysisSettings_GetSecretScanningEnabledForNewRepositories(tt *testing.T) {
+	var zeroValue bool
+	e := &EnterpriseSecurityAnalysisSettings{SecretScanningEnabledForNewRepositories: &zeroValue}
+	e.GetSecretScanningEnabledForNewRepositories()
+	e = &EnterpriseSecurityAnalysisSettings{}
+	e.GetSecretScanningEnabledForNewRepositories()
+	e = nil
+	e.GetSecretScanningEnabledForNewRepositories()
+}
+
+func TestEnterpriseSecurityAnalysisSettings_GetSecretScanningPushProtectionCustomLink(tt *testing.T) {
+	var zeroValue string
+	e := &EnterpriseSecurityAnalysisSettings{SecretScanningPushProtectionCustomLink: &zeroValue}
+	e.GetSecretScanningPushProtectionCustomLink()
+	e = &EnterpriseSecurityAnalysisSettings{}
+	e.GetSecretScanningPushProtectionCustomLink()
+	e = nil
+	e.GetSecretScanningPushProtectionCustomLink()
+}
+
+func TestEnterpriseSecurityAnalysisSettings_GetSecretScanningPushProtectionEnabledForNewRepositories(tt *testing.T) {
+	var zeroValue bool
+	e := &EnterpriseSecurityAnalysisSettings{SecretScanningPushProtectionEnabledForNewRepositories: &zeroValue}
+	e.GetSecretScanningPushProtectionEnabledForNewRepositories()
+	e = &EnterpriseSecurityAnalysisSettings{}
+	e.GetSecretScanningPushProtectionEnabledForNewRepositories()
+	e = nil
+	e.GetSecretScanningPushProtectionEnabledForNewRepositories()
+}
+
+func TestEnvironment_GetCanAdminsBypass(tt *testing.T) {
+	var zeroValue bool
+	e := &Environment{CanAdminsBypass: &zeroValue}
+	e.GetCanAdminsBypass()
+	e = &Environment{}
+	e.GetCanAdminsBypass()
+	e = nil
+	e.GetCanAdminsBypass()
+}
+
 func TestEnvironment_GetCreatedAt(tt *testing.T) {
 	var zeroValue Timestamp
 	e := &Environment{CreatedAt: &zeroValue}
@@ -6146,7 +6794,7 @@ func TestEvent_GetActor(tt *testing.T) {
 }
 
 func TestEvent_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	e := &Event{CreatedAt: &zeroValue}
 	e.GetCreatedAt()
 	e = &Event{}
@@ -6527,7 +7175,7 @@ func TestGist_GetComments(tt *testing.T) {
 }
 
 func TestGist_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	g := &Gist{CreatedAt: &zeroValue}
 	g.GetCreatedAt()
 	g = &Gist{}
@@ -6624,7 +7272,7 @@ func TestGist_GetPublic(tt *testing.T) {
 }
 
 func TestGist_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	g := &Gist{UpdatedAt: &zeroValue}
 	g.GetUpdatedAt()
 	g = &Gist{}
@@ -6644,7 +7292,7 @@ func TestGistComment_GetBody(tt *testing.T) {
 }
 
 func TestGistComment_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	g := &GistComment{CreatedAt: &zeroValue}
 	g.GetCreatedAt()
 	g = &GistComment{}
@@ -7037,7 +7685,7 @@ func TestGPGKey_GetCanSign(tt *testing.T) {
 }
 
 func TestGPGKey_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	g := &GPGKey{CreatedAt: &zeroValue}
 	g.GetCreatedAt()
 	g = &GPGKey{}
@@ -7047,7 +7695,7 @@ func TestGPGKey_GetCreatedAt(tt *testing.T) {
 }
 
 func TestGPGKey_GetExpiresAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	g := &GPGKey{ExpiresAt: &zeroValue}
 	g.GetExpiresAt()
 	g = &GPGKey{}
@@ -7248,7 +7896,7 @@ func TestHook_GetActive(tt *testing.T) {
 }
 
 func TestHook_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	h := &Hook{CreatedAt: &zeroValue}
 	h.GetCreatedAt()
 	h = &Hook{}
@@ -7308,7 +7956,7 @@ func TestHook_GetType(tt *testing.T) {
 }
 
 func TestHook_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	h := &Hook{UpdatedAt: &zeroValue}
 	h.GetUpdatedAt()
 	h = &Hook{}
@@ -7996,6 +8644,13 @@ func TestInstallationEvent_GetInstallation(tt *testing.T) {
 	i.GetInstallation()
 }
 
+func TestInstallationEvent_GetRequester(tt *testing.T) {
+	i := &InstallationEvent{}
+	i.GetRequester()
+	i = nil
+	i.GetRequester()
+}
+
 func TestInstallationEvent_GetSender(tt *testing.T) {
 	i := &InstallationEvent{}
 	i.GetSender()
@@ -8408,7 +9063,7 @@ func TestInstallationRepositoriesEvent_GetSender(tt *testing.T) {
 }
 
 func TestInstallationToken_GetExpiresAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &InstallationToken{ExpiresAt: &zeroValue}
 	i.GetExpiresAt()
 	i = &InstallationToken{}
@@ -8472,7 +9127,7 @@ func TestInteractionRestriction_GetOrigin(tt *testing.T) {
 }
 
 func TestInvitation_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &Invitation{CreatedAt: &zeroValue}
 	i.GetCreatedAt()
 	i = &Invitation{}
@@ -8616,7 +9271,7 @@ func TestIssue_GetBody(tt *testing.T) {
 }
 
 func TestIssue_GetClosedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &Issue{ClosedAt: &zeroValue}
 	i.GetClosedAt()
 	i = &Issue{}
@@ -8653,7 +9308,7 @@ func TestIssue_GetCommentsURL(tt *testing.T) {
 }
 
 func TestIssue_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &Issue{CreatedAt: &zeroValue}
 	i.GetCreatedAt()
 	i = &Issue{}
@@ -8780,6 +9435,16 @@ func TestIssue_GetState(tt *testing.T) {
 	i.GetState()
 }
 
+func TestIssue_GetStateReason(tt *testing.T) {
+	var zeroValue string
+	i := &Issue{StateReason: &zeroValue}
+	i.GetStateReason()
+	i = &Issue{}
+	i.GetStateReason()
+	i = nil
+	i.GetStateReason()
+}
+
 func TestIssue_GetTitle(tt *testing.T) {
 	var zeroValue string
 	i := &Issue{Title: &zeroValue}
@@ -8791,7 +9456,7 @@ func TestIssue_GetTitle(tt *testing.T) {
 }
 
 func TestIssue_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &Issue{UpdatedAt: &zeroValue}
 	i.GetUpdatedAt()
 	i = &Issue{}
@@ -8838,7 +9503,7 @@ func TestIssueComment_GetBody(tt *testing.T) {
 }
 
 func TestIssueComment_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &IssueComment{CreatedAt: &zeroValue}
 	i.GetCreatedAt()
 	i = &IssueComment{}
@@ -8895,7 +9560,7 @@ func TestIssueComment_GetReactions(tt *testing.T) {
 }
 
 func TestIssueComment_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &IssueComment{UpdatedAt: &zeroValue}
 	i.GetUpdatedAt()
 	i = &IssueComment{}
@@ -9012,7 +9677,7 @@ func TestIssueEvent_GetCommitID(tt *testing.T) {
 }
 
 func TestIssueEvent_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &IssueEvent{CreatedAt: &zeroValue}
 	i.GetCreatedAt()
 	i = &IssueEvent{}
@@ -9138,7 +9803,7 @@ func TestIssueImport_GetClosed(tt *testing.T) {
 }
 
 func TestIssueImport_GetClosedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &IssueImport{ClosedAt: &zeroValue}
 	i.GetClosedAt()
 	i = &IssueImport{}
@@ -9148,7 +9813,7 @@ func TestIssueImport_GetClosedAt(tt *testing.T) {
 }
 
 func TestIssueImport_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &IssueImport{CreatedAt: &zeroValue}
 	i.GetCreatedAt()
 	i = &IssueImport{}
@@ -9168,7 +9833,7 @@ func TestIssueImport_GetMilestone(tt *testing.T) {
 }
 
 func TestIssueImport_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &IssueImport{UpdatedAt: &zeroValue}
 	i.GetUpdatedAt()
 	i = &IssueImport{}
@@ -9228,7 +9893,7 @@ func TestIssueImportError_GetValue(tt *testing.T) {
 }
 
 func TestIssueImportResponse_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &IssueImportResponse{CreatedAt: &zeroValue}
 	i.GetCreatedAt()
 	i = &IssueImportResponse{}
@@ -9298,7 +9963,7 @@ func TestIssueImportResponse_GetStatus(tt *testing.T) {
 }
 
 func TestIssueImportResponse_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	i := &IssueImportResponse{UpdatedAt: &zeroValue}
 	i.GetUpdatedAt()
 	i = &IssueImportResponse{}
@@ -9472,6 +10137,13 @@ func TestIssuesEvent_GetLabel(tt *testing.T) {
 	i.GetLabel()
 }
 
+func TestIssuesEvent_GetMilestone(tt *testing.T) {
+	i := &IssuesEvent{}
+	i.GetMilestone()
+	i = nil
+	i.GetMilestone()
+}
+
 func TestIssuesEvent_GetRepo(tt *testing.T) {
 	i := &IssuesEvent{}
 	i.GetRepo()
@@ -9546,6 +10218,16 @@ func TestJobs_GetTotalCount(tt *testing.T) {
 	j.GetTotalCount()
 }
 
+func TestKey_GetAddedBy(tt *testing.T) {
+	var zeroValue string
+	k := &Key{AddedBy: &zeroValue}
+	k.GetAddedBy()
+	k = &Key{}
+	k.GetAddedBy()
+	k = nil
+	k.GetAddedBy()
+}
+
 func TestKey_GetCreatedAt(tt *testing.T) {
 	var zeroValue Timestamp
 	k := &Key{CreatedAt: &zeroValue}
@@ -9576,6 +10258,16 @@ func TestKey_GetKey(tt *testing.T) {
 	k.GetKey()
 }
 
+func TestKey_GetLastUsed(tt *testing.T) {
+	var zeroValue Timestamp
+	k := &Key{LastUsed: &zeroValue}
+	k.GetLastUsed()
+	k = &Key{}
+	k.GetLastUsed()
+	k = nil
+	k.GetLastUsed()
+}
+
 func TestKey_GetReadOnly(tt *testing.T) {
 	var zeroValue bool
 	k := &Key{ReadOnly: &zeroValue}
@@ -10255,6 +10947,16 @@ func TestLocation_GetStartLine(tt *testing.T) {
 	l.GetStartLine()
 }
 
+func TestLockBranch_GetEnabled(tt *testing.T) {
+	var zeroValue bool
+	l := &LockBranch{Enabled: &zeroValue}
+	l.GetEnabled()
+	l = &LockBranch{}
+	l.GetEnabled()
+	l = nil
+	l.GetEnabled()
+}
+
 func TestMarketplacePendingChange_GetEffectiveDate(tt *testing.T) {
 	var zeroValue Timestamp
 	m := &MarketplacePendingChange{EffectiveDate: &zeroValue}
@@ -10486,6 +11188,13 @@ func TestMarketplacePlanAccount_GetURL(tt *testing.T) {
 	m.GetURL()
 }
 
+func TestMarketplacePurchase_GetAccount(tt *testing.T) {
+	m := &MarketplacePurchase{}
+	m.GetAccount()
+	m = nil
+	m.GetAccount()
+}
+
 func TestMarketplacePurchase_GetBillingCycle(tt *testing.T) {
 	var zeroValue string
 	m := &MarketplacePurchase{BillingCycle: &zeroValue}
@@ -10553,6 +11262,76 @@ func TestMarketplacePurchase_GetUpdatedAt(tt *testing.T) {
 	m.GetUpdatedAt()
 }
 
+func TestMarketplacePurchaseAccount_GetEmail(tt *testing.T) {
+	var zeroValue string
+	m := &MarketplacePurchaseAccount{Email: &zeroValue}
+	m.GetEmail()
+	m = &MarketplacePurchaseAccount{}
+	m.GetEmail()
+	m = nil
+	m.GetEmail()
+}
+
+func TestMarketplacePurchaseAccount_GetID(tt *testing.T) {
+	var zeroValue int64
+	m := &MarketplacePurchaseAccount{ID: &zeroValue}
+	m.GetID()
+	m = &MarketplacePurchaseAccount{}
+	m.GetID()
+	m = nil
+	m.GetID()
+}
+
+func TestMarketplacePurchaseAccount_GetLogin(tt *testing.T) {
+	var zeroValue string
+	m := &MarketplacePurchaseAccount{Login: &zeroValue}
+	m.GetLogin()
+	m = &MarketplacePurchaseAccount{}
+	m.GetLogin()
+	m = nil
+	m.GetLogin()
+}
+
+func TestMarketplacePurchaseAccount_GetNodeID(tt *testing.T) {
+	var zeroValue string
+	m := &MarketplacePurchaseAccount{NodeID: &zeroValue}
+	m.GetNodeID()
+	m = &MarketplacePurchaseAccount{}
+	m.GetNodeID()
+	m = nil
+	m.GetNodeID()
+}
+
+func TestMarketplacePurchaseAccount_GetOrganizationBillingEmail(tt *testing.T) {
+	var zeroValue string
+	m := &MarketplacePurchaseAccount{OrganizationBillingEmail: &zeroValue}
+	m.GetOrganizationBillingEmail()
+	m = &MarketplacePurchaseAccount{}
+	m.GetOrganizationBillingEmail()
+	m = nil
+	m.GetOrganizationBillingEmail()
+}
+
+func TestMarketplacePurchaseAccount_GetType(tt *testing.T) {
+	var zeroValue string
+	m := &MarketplacePurchaseAccount{Type: &zeroValue}
+	m.GetType()
+	m = &MarketplacePurchaseAccount{}
+	m.GetType()
+	m = nil
+	m.GetType()
+}
+
+func TestMarketplacePurchaseAccount_GetURL(tt *testing.T) {
+	var zeroValue string
+	m := &MarketplacePurchaseAccount{URL: &zeroValue}
+	m.GetURL()
+	m = &MarketplacePurchaseAccount{}
+	m.GetURL()
+	m = nil
+	m.GetURL()
+}
+
 func TestMarketplacePurchaseEvent_GetAction(tt *testing.T) {
 	var zeroValue string
 	m := &MarketplacePurchaseEvent{Action: &zeroValue}
@@ -11056,7 +11835,7 @@ func TestMigration_GetURL(tt *testing.T) {
 }
 
 func TestMilestone_GetClosedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	m := &Milestone{ClosedAt: &zeroValue}
 	m.GetClosedAt()
 	m = &Milestone{}
@@ -11076,7 +11855,7 @@ func TestMilestone_GetClosedIssues(tt *testing.T) {
 }
 
 func TestMilestone_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	m := &Milestone{CreatedAt: &zeroValue}
 	m.GetCreatedAt()
 	m = &Milestone{}
@@ -11103,7 +11882,7 @@ func TestMilestone_GetDescription(tt *testing.T) {
 }
 
 func TestMilestone_GetDueOn(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	m := &Milestone{DueOn: &zeroValue}
 	m.GetDueOn()
 	m = &Milestone{}
@@ -11193,7 +11972,7 @@ func TestMilestone_GetTitle(tt *testing.T) {
 }
 
 func TestMilestone_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	m := &Milestone{UpdatedAt: &zeroValue}
 	m.GetUpdatedAt()
 	m = &Milestone{}
@@ -11489,7 +12268,7 @@ func TestNotification_GetID(tt *testing.T) {
 }
 
 func TestNotification_GetLastReadAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	n := &Notification{LastReadAt: &zeroValue}
 	n.GetLastReadAt()
 	n = &Notification{}
@@ -11533,7 +12312,7 @@ func TestNotification_GetUnread(tt *testing.T) {
 }
 
 func TestNotification_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	n := &Notification{UpdatedAt: &zeroValue}
 	n.GetUpdatedAt()
 	n = &Notification{}
@@ -11622,6 +12401,16 @@ func TestOAuthAPP_GetURL(tt *testing.T) {
 	o.GetURL()
 }
 
+func TestOIDCSubjectClaimCustomTemplate_GetUseDefault(tt *testing.T) {
+	var zeroValue bool
+	o := &OIDCSubjectClaimCustomTemplate{UseDefault: &zeroValue}
+	o.GetUseDefault()
+	o = &OIDCSubjectClaimCustomTemplate{}
+	o.GetUseDefault()
+	o = nil
+	o.GetUseDefault()
+}
+
 func TestOrganization_GetAdvancedSecurityEnabledForNewRepos(tt *testing.T) {
 	var zeroValue bool
 	o := &Organization{AdvancedSecurityEnabledForNewRepos: &zeroValue}
@@ -11683,7 +12472,7 @@ func TestOrganization_GetCompany(tt *testing.T) {
 }
 
 func TestOrganization_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	o := &Organization{CreatedAt: &zeroValue}
 	o.GetCreatedAt()
 	o = &Organization{}
@@ -12013,7 +12802,7 @@ func TestOrganization_GetNodeID(tt *testing.T) {
 }
 
 func TestOrganization_GetOwnedPrivateRepos(tt *testing.T) {
-	var zeroValue int
+	var zeroValue int64
 	o := &Organization{OwnedPrivateRepos: &zeroValue}
 	o.GetOwnedPrivateRepos()
 	o = &Organization{}
@@ -12100,7 +12889,7 @@ func TestOrganization_GetSecretScanningPushProtectionEnabledForNewRepos(tt *test
 }
 
 func TestOrganization_GetTotalPrivateRepos(tt *testing.T) {
-	var zeroValue int
+	var zeroValue int64
 	o := &Organization{TotalPrivateRepos: &zeroValue}
 	o.GetTotalPrivateRepos()
 	o = &Organization{}
@@ -12140,7 +12929,7 @@ func TestOrganization_GetType(tt *testing.T) {
 }
 
 func TestOrganization_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	o := &Organization{UpdatedAt: &zeroValue}
 	o.GetUpdatedAt()
 	o = &Organization{}
@@ -12272,6 +13061,113 @@ func TestOrgBlockEvent_GetSender(tt *testing.T) {
 	o.GetSender()
 }
 
+func TestOrgRequiredWorkflow_GetCreatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	o := &OrgRequiredWorkflow{CreatedAt: &zeroValue}
+	o.GetCreatedAt()
+	o = &OrgRequiredWorkflow{}
+	o.GetCreatedAt()
+	o = nil
+	o.GetCreatedAt()
+}
+
+func TestOrgRequiredWorkflow_GetID(tt *testing.T) {
+	var zeroValue int64
+	o := &OrgRequiredWorkflow{ID: &zeroValue}
+	o.GetID()
+	o = &OrgRequiredWorkflow{}
+	o.GetID()
+	o = nil
+	o.GetID()
+}
+
+func TestOrgRequiredWorkflow_GetName(tt *testing.T) {
+	var zeroValue string
+	o := &OrgRequiredWorkflow{Name: &zeroValue}
+	o.GetName()
+	o = &OrgRequiredWorkflow{}
+	o.GetName()
+	o = nil
+	o.GetName()
+}
+
+func TestOrgRequiredWorkflow_GetPath(tt *testing.T) {
+	var zeroValue string
+	o := &OrgRequiredWorkflow{Path: &zeroValue}
+	o.GetPath()
+	o = &OrgRequiredWorkflow{}
+	o.GetPath()
+	o = nil
+	o.GetPath()
+}
+
+func TestOrgRequiredWorkflow_GetRef(tt *testing.T) {
+	var zeroValue string
+	o := &OrgRequiredWorkflow{Ref: &zeroValue}
+	o.GetRef()
+	o = &OrgRequiredWorkflow{}
+	o.GetRef()
+	o = nil
+	o.GetRef()
+}
+
+func TestOrgRequiredWorkflow_GetRepository(tt *testing.T) {
+	o := &OrgRequiredWorkflow{}
+	o.GetRepository()
+	o = nil
+	o.GetRepository()
+}
+
+func TestOrgRequiredWorkflow_GetScope(tt *testing.T) {
+	var zeroValue string
+	o := &OrgRequiredWorkflow{Scope: &zeroValue}
+	o.GetScope()
+	o = &OrgRequiredWorkflow{}
+	o.GetScope()
+	o = nil
+	o.GetScope()
+}
+
+func TestOrgRequiredWorkflow_GetSelectedRepositoriesURL(tt *testing.T) {
+	var zeroValue string
+	o := &OrgRequiredWorkflow{SelectedRepositoriesURL: &zeroValue}
+	o.GetSelectedRepositoriesURL()
+	o = &OrgRequiredWorkflow{}
+	o.GetSelectedRepositoriesURL()
+	o = nil
+	o.GetSelectedRepositoriesURL()
+}
+
+func TestOrgRequiredWorkflow_GetState(tt *testing.T) {
+	var zeroValue string
+	o := &OrgRequiredWorkflow{State: &zeroValue}
+	o.GetState()
+	o = &OrgRequiredWorkflow{}
+	o.GetState()
+	o = nil
+	o.GetState()
+}
+
+func TestOrgRequiredWorkflow_GetUpdatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	o := &OrgRequiredWorkflow{UpdatedAt: &zeroValue}
+	o.GetUpdatedAt()
+	o = &OrgRequiredWorkflow{}
+	o.GetUpdatedAt()
+	o = nil
+	o.GetUpdatedAt()
+}
+
+func TestOrgRequiredWorkflows_GetTotalCount(tt *testing.T) {
+	var zeroValue int
+	o := &OrgRequiredWorkflows{TotalCount: &zeroValue}
+	o.GetTotalCount()
+	o = &OrgRequiredWorkflows{}
+	o.GetTotalCount()
+	o = nil
+	o.GetTotalCount()
+}
+
 func TestOrgStats_GetDisabledOrgs(tt *testing.T) {
 	var zeroValue int
 	o := &OrgStats{DisabledOrgs: &zeroValue}
@@ -12312,6 +13208,20 @@ func TestOrgStats_GetTotalTeams(tt *testing.T) {
 	o.GetTotalTeams()
 }
 
+func TestOwnerInfo_GetOrg(tt *testing.T) {
+	o := &OwnerInfo{}
+	o.GetOrg()
+	o = nil
+	o.GetOrg()
+}
+
+func TestOwnerInfo_GetUser(tt *testing.T) {
+	o := &OwnerInfo{}
+	o.GetUser()
+	o = nil
+	o.GetUser()
+}
+
 func TestPackage_GetCreatedAt(tt *testing.T) {
 	var zeroValue Timestamp
 	p := &Package{CreatedAt: &zeroValue}
@@ -13095,6 +14005,16 @@ func TestPageBuildEvent_GetSender(tt *testing.T) {
 	p.GetSender()
 }
 
+func TestPages_GetBuildType(tt *testing.T) {
+	var zeroValue string
+	p := &Pages{BuildType: &zeroValue}
+	p.GetBuildType()
+	p = &Pages{}
+	p.GetBuildType()
+	p = nil
+	p.GetBuildType()
+}
+
 func TestPages_GetCNAME(tt *testing.T) {
 	var zeroValue string
 	p := &Pages{CNAME: &zeroValue}
@@ -13250,7 +14170,287 @@ func TestPagesBuild_GetURL(tt *testing.T) {
 	p = &PagesBuild{}
 	p.GetURL()
 	p = nil
-	p.GetURL()
+	p.GetURL()
+}
+
+func TestPagesDomain_GetCAAError(tt *testing.T) {
+	var zeroValue string
+	p := &PagesDomain{CAAError: &zeroValue}
+	p.GetCAAError()
+	p = &PagesDomain{}
+	p.GetCAAError()
+	p = nil
+	p.GetCAAError()
+}
+
+func TestPagesDomain_GetDNSResolves(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{DNSResolves: &zeroValue}
+	p.GetDNSResolves()
+	p = &PagesDomain{}
+	p.GetDNSResolves()
+	p = nil
+	p.GetDNSResolves()
+}
+
+func TestPagesDomain_GetEnforcesHTTPS(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{EnforcesHTTPS: &zeroValue}
+	p.GetEnforcesHTTPS()
+	p = &PagesDomain{}
+	p.GetEnforcesHTTPS()
+	p = nil
+	p.GetEnforcesHTTPS()
+}
+
+func TestPagesDomain_GetHasCNAMERecord(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{HasCNAMERecord: &zeroValue}
+	p.GetHasCNAMERecord()
+	p = &PagesDomain{}
+	p.GetHasCNAMERecord()
+	p = nil
+	p.GetHasCNAMERecord()
+}
+
+func TestPagesDomain_GetHasMXRecordsPresent(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{HasMXRecordsPresent: &zeroValue}
+	p.GetHasMXRecordsPresent()
+	p = &PagesDomain{}
+	p.GetHasMXRecordsPresent()
+	p = nil
+	p.GetHasMXRecordsPresent()
+}
+
+func TestPagesDomain_GetHost(tt *testing.T) {
+	var zeroValue string
+	p := &PagesDomain{Host: &zeroValue}
+	p.GetHost()
+	p = &PagesDomain{}
+	p.GetHost()
+	p = nil
+	p.GetHost()
+}
+
+func TestPagesDomain_GetHTTPSError(tt *testing.T) {
+	var zeroValue string
+	p := &PagesDomain{HTTPSError: &zeroValue}
+	p.GetHTTPSError()
+	p = &PagesDomain{}
+	p.GetHTTPSError()
+	p = nil
+	p.GetHTTPSError()
+}
+
+func TestPagesDomain_GetIsApexDomain(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsApexDomain: &zeroValue}
+	p.GetIsApexDomain()
+	p = &PagesDomain{}
+	p.GetIsApexDomain()
+	p = nil
+	p.GetIsApexDomain()
+}
+
+func TestPagesDomain_GetIsARecord(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsARecord: &zeroValue}
+	p.GetIsARecord()
+	p = &PagesDomain{}
+	p.GetIsARecord()
+	p = nil
+	p.GetIsARecord()
+}
+
+func TestPagesDomain_GetIsCloudflareIP(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsCloudflareIP: &zeroValue}
+	p.GetIsCloudflareIP()
+	p = &PagesDomain{}
+	p.GetIsCloudflareIP()
+	p = nil
+	p.GetIsCloudflareIP()
+}
+
+func TestPagesDomain_GetIsCNAMEToFastly(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsCNAMEToFastly: &zeroValue}
+	p.GetIsCNAMEToFastly()
+	p = &PagesDomain{}
+	p.GetIsCNAMEToFastly()
+	p = nil
+	p.GetIsCNAMEToFastly()
+}
+
+func TestPagesDomain_GetIsCNAMEToGithubUserDomain(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsCNAMEToGithubUserDomain: &zeroValue}
+	p.GetIsCNAMEToGithubUserDomain()
+	p = &PagesDomain{}
+	p.GetIsCNAMEToGithubUserDomain()
+	p = nil
+	p.GetIsCNAMEToGithubUserDomain()
+}
+
+func TestPagesDomain_GetIsCNAMEToPagesDotGithubDotCom(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsCNAMEToPagesDotGithubDotCom: &zeroValue}
+	p.GetIsCNAMEToPagesDotGithubDotCom()
+	p = &PagesDomain{}
+	p.GetIsCNAMEToPagesDotGithubDotCom()
+	p = nil
+	p.GetIsCNAMEToPagesDotGithubDotCom()
+}
+
+func TestPagesDomain_GetIsFastlyIP(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsFastlyIP: &zeroValue}
+	p.GetIsFastlyIP()
+	p = &PagesDomain{}
+	p.GetIsFastlyIP()
+	p = nil
+	p.GetIsFastlyIP()
+}
+
+func TestPagesDomain_GetIsHTTPSEligible(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsHTTPSEligible: &zeroValue}
+	p.GetIsHTTPSEligible()
+	p = &PagesDomain{}
+	p.GetIsHTTPSEligible()
+	p = nil
+	p.GetIsHTTPSEligible()
+}
+
+func TestPagesDomain_GetIsNonGithubPagesIPPresent(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsNonGithubPagesIPPresent: &zeroValue}
+	p.GetIsNonGithubPagesIPPresent()
+	p = &PagesDomain{}
+	p.GetIsNonGithubPagesIPPresent()
+	p = nil
+	p.GetIsNonGithubPagesIPPresent()
+}
+
+func TestPagesDomain_GetIsOldIPAddress(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsOldIPAddress: &zeroValue}
+	p.GetIsOldIPAddress()
+	p = &PagesDomain{}
+	p.GetIsOldIPAddress()
+	p = nil
+	p.GetIsOldIPAddress()
+}
+
+func TestPagesDomain_GetIsPagesDomain(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsPagesDomain: &zeroValue}
+	p.GetIsPagesDomain()
+	p = &PagesDomain{}
+	p.GetIsPagesDomain()
+	p = nil
+	p.GetIsPagesDomain()
+}
+
+func TestPagesDomain_GetIsPointedToGithubPagesIP(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsPointedToGithubPagesIP: &zeroValue}
+	p.GetIsPointedToGithubPagesIP()
+	p = &PagesDomain{}
+	p.GetIsPointedToGithubPagesIP()
+	p = nil
+	p.GetIsPointedToGithubPagesIP()
+}
+
+func TestPagesDomain_GetIsProxied(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsProxied: &zeroValue}
+	p.GetIsProxied()
+	p = &PagesDomain{}
+	p.GetIsProxied()
+	p = nil
+	p.GetIsProxied()
+}
+
+func TestPagesDomain_GetIsServedByPages(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsServedByPages: &zeroValue}
+	p.GetIsServedByPages()
+	p = &PagesDomain{}
+	p.GetIsServedByPages()
+	p = nil
+	p.GetIsServedByPages()
+}
+
+func TestPagesDomain_GetIsValid(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsValid: &zeroValue}
+	p.GetIsValid()
+	p = &PagesDomain{}
+	p.GetIsValid()
+	p = nil
+	p.GetIsValid()
+}
+
+func TestPagesDomain_GetIsValidDomain(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{IsValidDomain: &zeroValue}
+	p.GetIsValidDomain()
+	p = &PagesDomain{}
+	p.GetIsValidDomain()
+	p = nil
+	p.GetIsValidDomain()
+}
+
+func TestPagesDomain_GetNameservers(tt *testing.T) {
+	var zeroValue string
+	p := &PagesDomain{Nameservers: &zeroValue}
+	p.GetNameservers()
+	p = &PagesDomain{}
+	p.GetNameservers()
+	p = nil
+	p.GetNameservers()
+}
+
+func TestPagesDomain_GetReason(tt *testing.T) {
+	var zeroValue string
+	p := &PagesDomain{Reason: &zeroValue}
+	p.GetReason()
+	p = &PagesDomain{}
+	p.GetReason()
+	p = nil
+	p.GetReason()
+}
+
+func TestPagesDomain_GetRespondsToHTTPS(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{RespondsToHTTPS: &zeroValue}
+	p.GetRespondsToHTTPS()
+	p = &PagesDomain{}
+	p.GetRespondsToHTTPS()
+	p = nil
+	p.GetRespondsToHTTPS()
+}
+
+func TestPagesDomain_GetShouldBeARecord(tt *testing.T) {
+	var zeroValue bool
+	p := &PagesDomain{ShouldBeARecord: &zeroValue}
+	p.GetShouldBeARecord()
+	p = &PagesDomain{}
+	p.GetShouldBeARecord()
+	p = nil
+	p.GetShouldBeARecord()
+}
+
+func TestPagesDomain_GetURI(tt *testing.T) {
+	var zeroValue string
+	p := &PagesDomain{URI: &zeroValue}
+	p.GetURI()
+	p = &PagesDomain{}
+	p.GetURI()
+	p = nil
+	p.GetURI()
 }
 
 func TestPagesError_GetMessage(tt *testing.T) {
@@ -13263,6 +14463,20 @@ func TestPagesError_GetMessage(tt *testing.T) {
 	p.GetMessage()
 }
 
+func TestPagesHealthCheckResponse_GetAltDomain(tt *testing.T) {
+	p := &PagesHealthCheckResponse{}
+	p.GetAltDomain()
+	p = nil
+	p.GetAltDomain()
+}
+
+func TestPagesHealthCheckResponse_GetDomain(tt *testing.T) {
+	p := &PagesHealthCheckResponse{}
+	p.GetDomain()
+	p = nil
+	p.GetDomain()
+}
+
 func TestPagesHTTPSCertificate_GetDescription(tt *testing.T) {
 	var zeroValue string
 	p := &PagesHTTPSCertificate{Description: &zeroValue}
@@ -13323,6 +14537,16 @@ func TestPageStats_GetTotalPages(tt *testing.T) {
 	p.GetTotalPages()
 }
 
+func TestPagesUpdate_GetBuildType(tt *testing.T) {
+	var zeroValue string
+	p := &PagesUpdate{BuildType: &zeroValue}
+	p.GetBuildType()
+	p = &PagesUpdate{}
+	p.GetBuildType()
+	p = nil
+	p.GetBuildType()
+}
+
 func TestPagesUpdate_GetCNAME(tt *testing.T) {
 	var zeroValue string
 	p := &PagesUpdate{CNAME: &zeroValue}
@@ -13446,7 +14670,7 @@ func TestPlan_GetName(tt *testing.T) {
 }
 
 func TestPlan_GetPrivateRepos(tt *testing.T) {
-	var zeroValue int
+	var zeroValue int64
 	p := &Plan{PrivateRepos: &zeroValue}
 	p.GetPrivateRepos()
 	p = &Plan{}
@@ -14310,6 +15534,20 @@ func TestProtection_GetAllowForcePushes(tt *testing.T) {
 	p.GetAllowForcePushes()
 }
 
+func TestProtection_GetAllowForkSyncing(tt *testing.T) {
+	p := &Protection{}
+	p.GetAllowForkSyncing()
+	p = nil
+	p.GetAllowForkSyncing()
+}
+
+func TestProtection_GetBlockCreations(tt *testing.T) {
+	p := &Protection{}
+	p.GetBlockCreations()
+	p = nil
+	p.GetBlockCreations()
+}
+
 func TestProtection_GetEnforceAdmins(tt *testing.T) {
 	p := &Protection{}
 	p.GetEnforceAdmins()
@@ -14317,6 +15555,13 @@ func TestProtection_GetEnforceAdmins(tt *testing.T) {
 	p.GetEnforceAdmins()
 }
 
+func TestProtection_GetLockBranch(tt *testing.T) {
+	p := &Protection{}
+	p.GetLockBranch()
+	p = nil
+	p.GetLockBranch()
+}
+
 func TestProtection_GetRequiredConversationResolution(tt *testing.T) {
 	p := &Protection{}
 	p.GetRequiredConversationResolution()
@@ -14331,6 +15576,13 @@ func TestProtection_GetRequiredPullRequestReviews(tt *testing.T) {
 	p.GetRequiredPullRequestReviews()
 }
 
+func TestProtection_GetRequiredSignatures(tt *testing.T) {
+	p := &Protection{}
+	p.GetRequiredSignatures()
+	p = nil
+	p.GetRequiredSignatures()
+}
+
 func TestProtection_GetRequiredStatusChecks(tt *testing.T) {
 	p := &Protection{}
 	p.GetRequiredStatusChecks()
@@ -14352,6 +15604,16 @@ func TestProtection_GetRestrictions(tt *testing.T) {
 	p.GetRestrictions()
 }
 
+func TestProtection_GetURL(tt *testing.T) {
+	var zeroValue string
+	p := &Protection{URL: &zeroValue}
+	p.GetURL()
+	p = &Protection{}
+	p.GetURL()
+	p = nil
+	p.GetURL()
+}
+
 func TestProtectionChanges_GetAdminEnforced(tt *testing.T) {
 	p := &ProtectionChanges{}
 	p.GetAdminEnforced()
@@ -14477,6 +15739,36 @@ func TestProtectionRequest_GetAllowForcePushes(tt *testing.T) {
 	p.GetAllowForcePushes()
 }
 
+func TestProtectionRequest_GetAllowForkSyncing(tt *testing.T) {
+	var zeroValue bool
+	p := &ProtectionRequest{AllowForkSyncing: &zeroValue}
+	p.GetAllowForkSyncing()
+	p = &ProtectionRequest{}
+	p.GetAllowForkSyncing()
+	p = nil
+	p.GetAllowForkSyncing()
+}
+
+func TestProtectionRequest_GetBlockCreations(tt *testing.T) {
+	var zeroValue bool
+	p := &ProtectionRequest{BlockCreations: &zeroValue}
+	p.GetBlockCreations()
+	p = &ProtectionRequest{}
+	p.GetBlockCreations()
+	p = nil
+	p.GetBlockCreations()
+}
+
+func TestProtectionRequest_GetLockBranch(tt *testing.T) {
+	var zeroValue bool
+	p := &ProtectionRequest{LockBranch: &zeroValue}
+	p.GetLockBranch()
+	p = &ProtectionRequest{}
+	p.GetLockBranch()
+	p = nil
+	p.GetLockBranch()
+}
+
 func TestProtectionRequest_GetRequiredConversationResolution(tt *testing.T) {
 	var zeroValue bool
 	p := &ProtectionRequest{RequiredConversationResolution: &zeroValue}
@@ -14671,7 +15963,7 @@ func TestPullRequest_GetChangedFiles(tt *testing.T) {
 }
 
 func TestPullRequest_GetClosedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	p := &PullRequest{ClosedAt: &zeroValue}
 	p.GetClosedAt()
 	p = &PullRequest{}
@@ -14721,7 +16013,7 @@ func TestPullRequest_GetCommitsURL(tt *testing.T) {
 }
 
 func TestPullRequest_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	p := &PullRequest{CreatedAt: &zeroValue}
 	p.GetCreatedAt()
 	p = &PullRequest{}
@@ -14865,7 +16157,7 @@ func TestPullRequest_GetMerged(tt *testing.T) {
 }
 
 func TestPullRequest_GetMergedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	p := &PullRequest{MergedAt: &zeroValue}
 	p.GetMergedAt()
 	p = &PullRequest{}
@@ -14989,7 +16281,7 @@ func TestPullRequest_GetTitle(tt *testing.T) {
 }
 
 func TestPullRequest_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	p := &PullRequest{UpdatedAt: &zeroValue}
 	p.GetUpdatedAt()
 	p = &PullRequest{}
@@ -15157,7 +16449,7 @@ func TestPullRequestComment_GetCommitID(tt *testing.T) {
 }
 
 func TestPullRequestComment_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	p := &PullRequestComment{CreatedAt: &zeroValue}
 	p.GetCreatedAt()
 	p = &PullRequestComment{}
@@ -15344,7 +16636,7 @@ func TestPullRequestComment_GetStartSide(tt *testing.T) {
 }
 
 func TestPullRequestComment_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	p := &PullRequestComment{UpdatedAt: &zeroValue}
 	p.GetUpdatedAt()
 	p = &PullRequestComment{}
@@ -15631,7 +16923,7 @@ func TestPullRequestReview_GetState(tt *testing.T) {
 }
 
 func TestPullRequestReview_GetSubmittedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	p := &PullRequestReview{SubmittedAt: &zeroValue}
 	p.GetSubmittedAt()
 	p = &PullRequestReview{}
@@ -15839,6 +17131,16 @@ func TestPullRequestReviewsEnforcementRequest_GetDismissalRestrictionsRequest(tt
 	p.GetDismissalRestrictionsRequest()
 }
 
+func TestPullRequestReviewsEnforcementRequest_GetRequireLastPushApproval(tt *testing.T) {
+	var zeroValue bool
+	p := &PullRequestReviewsEnforcementRequest{RequireLastPushApproval: &zeroValue}
+	p.GetRequireLastPushApproval()
+	p = &PullRequestReviewsEnforcementRequest{}
+	p.GetRequireLastPushApproval()
+	p = nil
+	p.GetRequireLastPushApproval()
+}
+
 func TestPullRequestReviewsEnforcementUpdate_GetBypassPullRequestAllowancesRequest(tt *testing.T) {
 	p := &PullRequestReviewsEnforcementUpdate{}
 	p.GetBypassPullRequestAllowancesRequest()
@@ -15873,6 +17175,16 @@ func TestPullRequestReviewsEnforcementUpdate_GetRequireCodeOwnerReviews(tt *test
 	p.GetRequireCodeOwnerReviews()
 }
 
+func TestPullRequestReviewsEnforcementUpdate_GetRequireLastPushApproval(tt *testing.T) {
+	var zeroValue bool
+	p := &PullRequestReviewsEnforcementUpdate{RequireLastPushApproval: &zeroValue}
+	p.GetRequireLastPushApproval()
+	p = &PullRequestReviewsEnforcementUpdate{}
+	p.GetRequireLastPushApproval()
+	p = nil
+	p.GetRequireLastPushApproval()
+}
+
 func TestPullRequestReviewThreadEvent_GetAction(tt *testing.T) {
 	var zeroValue string
 	p := &PullRequestReviewThreadEvent{Action: &zeroValue}
@@ -17192,6 +18504,123 @@ func TestRepoName_GetFrom(tt *testing.T) {
 	r.GetFrom()
 }
 
+func TestRepoRequiredWorkflow_GetBadgeURL(tt *testing.T) {
+	var zeroValue string
+	r := &RepoRequiredWorkflow{BadgeURL: &zeroValue}
+	r.GetBadgeURL()
+	r = &RepoRequiredWorkflow{}
+	r.GetBadgeURL()
+	r = nil
+	r.GetBadgeURL()
+}
+
+func TestRepoRequiredWorkflow_GetCreatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	r := &RepoRequiredWorkflow{CreatedAt: &zeroValue}
+	r.GetCreatedAt()
+	r = &RepoRequiredWorkflow{}
+	r.GetCreatedAt()
+	r = nil
+	r.GetCreatedAt()
+}
+
+func TestRepoRequiredWorkflow_GetHTMLURL(tt *testing.T) {
+	var zeroValue string
+	r := &RepoRequiredWorkflow{HTMLURL: &zeroValue}
+	r.GetHTMLURL()
+	r = &RepoRequiredWorkflow{}
+	r.GetHTMLURL()
+	r = nil
+	r.GetHTMLURL()
+}
+
+func TestRepoRequiredWorkflow_GetID(tt *testing.T) {
+	var zeroValue int64
+	r := &RepoRequiredWorkflow{ID: &zeroValue}
+	r.GetID()
+	r = &RepoRequiredWorkflow{}
+	r.GetID()
+	r = nil
+	r.GetID()
+}
+
+func TestRepoRequiredWorkflow_GetName(tt *testing.T) {
+	var zeroValue string
+	r := &RepoRequiredWorkflow{Name: &zeroValue}
+	r.GetName()
+	r = &RepoRequiredWorkflow{}
+	r.GetName()
+	r = nil
+	r.GetName()
+}
+
+func TestRepoRequiredWorkflow_GetNodeID(tt *testing.T) {
+	var zeroValue string
+	r := &RepoRequiredWorkflow{NodeID: &zeroValue}
+	r.GetNodeID()
+	r = &RepoRequiredWorkflow{}
+	r.GetNodeID()
+	r = nil
+	r.GetNodeID()
+}
+
+func TestRepoRequiredWorkflow_GetPath(tt *testing.T) {
+	var zeroValue string
+	r := &RepoRequiredWorkflow{Path: &zeroValue}
+	r.GetPath()
+	r = &RepoRequiredWorkflow{}
+	r.GetPath()
+	r = nil
+	r.GetPath()
+}
+
+func TestRepoRequiredWorkflow_GetSourceRepository(tt *testing.T) {
+	r := &RepoRequiredWorkflow{}
+	r.GetSourceRepository()
+	r = nil
+	r.GetSourceRepository()
+}
+
+func TestRepoRequiredWorkflow_GetState(tt *testing.T) {
+	var zeroValue string
+	r := &RepoRequiredWorkflow{State: &zeroValue}
+	r.GetState()
+	r = &RepoRequiredWorkflow{}
+	r.GetState()
+	r = nil
+	r.GetState()
+}
+
+func TestRepoRequiredWorkflow_GetUpdatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	r := &RepoRequiredWorkflow{UpdatedAt: &zeroValue}
+	r.GetUpdatedAt()
+	r = &RepoRequiredWorkflow{}
+	r.GetUpdatedAt()
+	r = nil
+	r.GetUpdatedAt()
+}
+
+func TestRepoRequiredWorkflow_GetURL(tt *testing.T) {
+	var zeroValue string
+	r := &RepoRequiredWorkflow{URL: &zeroValue}
+	r.GetURL()
+	r = &RepoRequiredWorkflow{}
+	r.GetURL()
+	r = nil
+	r.GetURL()
+}
+
+func TestRepoRequiredWorkflows_GetTotalCount(tt *testing.T) {
+	var zeroValue int
+	r := &RepoRequiredWorkflows{TotalCount: &zeroValue}
+	r.GetTotalCount()
+	r = &RepoRequiredWorkflows{}
+	r.GetTotalCount()
+	r = nil
+	r.GetTotalCount()
+}
+
 func TestRepositoriesSearchResult_GetIncompleteResults(tt *testing.T) {
 	var zeroValue bool
 	r := &RepositoriesSearchResult{IncompleteResults: &zeroValue}
@@ -17579,6 +19008,16 @@ func TestRepository_GetGitURL(tt *testing.T) {
 	r.GetGitURL()
 }
 
+func TestRepository_GetHasDiscussions(tt *testing.T) {
+	var zeroValue bool
+	r := &Repository{HasDiscussions: &zeroValue}
+	r.GetHasDiscussions()
+	r = &Repository{}
+	r.GetHasDiscussions()
+	r = nil
+	r.GetHasDiscussions()
+}
+
 func TestRepository_GetHasDownloads(tt *testing.T) {
 	var zeroValue bool
 	r := &Repository{HasDownloads: &zeroValue}
@@ -18198,6 +19637,26 @@ func TestRepository_GetWatchersCount(tt *testing.T) {
 	r.GetWatchersCount()
 }
 
+func TestRepository_GetWebCommitSignoffRequired(tt *testing.T) {
+	var zeroValue bool
+	r := &Repository{WebCommitSignoffRequired: &zeroValue}
+	r.GetWebCommitSignoffRequired()
+	r = &Repository{}
+	r.GetWebCommitSignoffRequired()
+	r = nil
+	r.GetWebCommitSignoffRequired()
+}
+
+func TestRepositoryActionsAccessLevel_GetAccessLevel(tt *testing.T) {
+	var zeroValue string
+	r := &RepositoryActionsAccessLevel{AccessLevel: &zeroValue}
+	r.GetAccessLevel()
+	r = &RepositoryActionsAccessLevel{}
+	r.GetAccessLevel()
+	r = nil
+	r.GetAccessLevel()
+}
+
 func TestRepositoryActiveCommitters_GetAdvancedSecurityCommitters(tt *testing.T) {
 	var zeroValue int
 	r := &RepositoryActiveCommitters{AdvancedSecurityCommitters: &zeroValue}
@@ -18239,7 +19698,7 @@ func TestRepositoryComment_GetCommitID(tt *testing.T) {
 }
 
 func TestRepositoryComment_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	r := &RepositoryComment{CreatedAt: &zeroValue}
 	r.GetCreatedAt()
 	r = &RepositoryComment{}
@@ -18306,7 +19765,7 @@ func TestRepositoryComment_GetReactions(tt *testing.T) {
 }
 
 func TestRepositoryComment_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	r := &RepositoryComment{UpdatedAt: &zeroValue}
 	r.GetUpdatedAt()
 	r = &RepositoryComment{}
@@ -19017,6 +20476,16 @@ func TestRepositoryRelease_GetID(tt *testing.T) {
 	r.GetID()
 }
 
+func TestRepositoryRelease_GetMakeLatest(tt *testing.T) {
+	var zeroValue string
+	r := &RepositoryRelease{MakeLatest: &zeroValue}
+	r.GetMakeLatest()
+	r = &RepositoryRelease{}
+	r.GetMakeLatest()
+	r = nil
+	r.GetMakeLatest()
+}
+
 func TestRepositoryRelease_GetName(tt *testing.T) {
 	var zeroValue string
 	r := &RepositoryRelease{Name: &zeroValue}
@@ -19390,7 +20859,7 @@ func TestRepoStatus_GetContext(tt *testing.T) {
 }
 
 func TestRepoStatus_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	r := &RepoStatus{CreatedAt: &zeroValue}
 	r.GetCreatedAt()
 	r = &RepoStatus{}
@@ -19457,7 +20926,7 @@ func TestRepoStatus_GetTargetURL(tt *testing.T) {
 }
 
 func TestRepoStatus_GetUpdatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	r := &RepoStatus{UpdatedAt: &zeroValue}
 	r.GetUpdatedAt()
 	r = &RepoStatus{}
@@ -19526,6 +20995,26 @@ func TestRequiredStatusCheck_GetAppID(tt *testing.T) {
 	r.GetAppID()
 }
 
+func TestRequiredStatusChecks_GetContextsURL(tt *testing.T) {
+	var zeroValue string
+	r := &RequiredStatusChecks{ContextsURL: &zeroValue}
+	r.GetContextsURL()
+	r = &RequiredStatusChecks{}
+	r.GetContextsURL()
+	r = nil
+	r.GetContextsURL()
+}
+
+func TestRequiredStatusChecks_GetURL(tt *testing.T) {
+	var zeroValue string
+	r := &RequiredStatusChecks{URL: &zeroValue}
+	r.GetURL()
+	r = &RequiredStatusChecks{}
+	r.GetURL()
+	r = nil
+	r.GetURL()
+}
+
 func TestRequiredStatusChecksEnforcementLevelChanges_GetFrom(tt *testing.T) {
 	var zeroValue string
 	r := &RequiredStatusChecksEnforcementLevelChanges{From: &zeroValue}
@@ -19546,6 +21035,16 @@ func TestRequiredStatusChecksRequest_GetStrict(tt *testing.T) {
 	r.GetStrict()
 }
 
+func TestRequiredWorkflowSelectedRepos_GetTotalCount(tt *testing.T) {
+	var zeroValue int
+	r := &RequiredWorkflowSelectedRepos{TotalCount: &zeroValue}
+	r.GetTotalCount()
+	r = &RequiredWorkflowSelectedRepos{}
+	r.GetTotalCount()
+	r = nil
+	r.GetTotalCount()
+}
+
 func TestReviewersRequest_GetNodeID(tt *testing.T) {
 	var zeroValue string
 	r := &ReviewersRequest{NodeID: &zeroValue}
@@ -22122,7 +23621,7 @@ func TestTimeline_GetCommitURL(tt *testing.T) {
 }
 
 func TestTimeline_GetCreatedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	t := &Timeline{CreatedAt: &zeroValue}
 	t.GetCreatedAt()
 	t = &Timeline{}
@@ -22189,6 +23688,13 @@ func TestTimeline_GetRename(tt *testing.T) {
 	t.GetRename()
 }
 
+func TestTimeline_GetRequestedTeam(tt *testing.T) {
+	t := &Timeline{}
+	t.GetRequestedTeam()
+	t = nil
+	t.GetRequestedTeam()
+}
+
 func TestTimeline_GetRequester(tt *testing.T) {
 	t := &Timeline{}
 	t.GetRequester()
@@ -22231,7 +23737,7 @@ func TestTimeline_GetState(tt *testing.T) {
 }
 
 func TestTimeline_GetSubmittedAt(tt *testing.T) {
-	var zeroValue time.Time
+	var zeroValue Timestamp
 	t := &Timeline{SubmittedAt: &zeroValue}
 	t.GetSubmittedAt()
 	t = &Timeline{}
@@ -22982,7 +24488,7 @@ func TestUser_GetOrganizationsURL(tt *testing.T) {
 }
 
 func TestUser_GetOwnedPrivateRepos(tt *testing.T) {
-	var zeroValue int
+	var zeroValue int64
 	u := &User{OwnedPrivateRepos: &zeroValue}
 	u.GetOwnedPrivateRepos()
 	u = &User{}
@@ -23109,7 +24615,7 @@ func TestUser_GetSuspendedAt(tt *testing.T) {
 }
 
 func TestUser_GetTotalPrivateRepos(tt *testing.T) {
-	var zeroValue int
+	var zeroValue int64
 	u := &User{TotalPrivateRepos: &zeroValue}
 	u.GetTotalPrivateRepos()
 	u = &User{}
@@ -23952,27 +25458,6 @@ func TestWorkflowDispatchEvent_GetWorkflow(tt *testing.T) {
 	w.GetWorkflow()
 }
 
-func TestWorkflowEnvironment_GetMacOS(tt *testing.T) {
-	w := &WorkflowEnvironment{}
-	w.GetMacOS()
-	w = nil
-	w.GetMacOS()
-}
-
-func TestWorkflowEnvironment_GetUbuntu(tt *testing.T) {
-	w := &WorkflowEnvironment{}
-	w.GetUbuntu()
-	w = nil
-	w.GetUbuntu()
-}
-
-func TestWorkflowEnvironment_GetWindows(tt *testing.T) {
-	w := &WorkflowEnvironment{}
-	w.GetWindows()
-	w = nil
-	w.GetWindows()
-}
-
 func TestWorkflowJob_GetCheckRunURL(tt *testing.T) {
 	var zeroValue string
 	w := &WorkflowJob{CheckRunURL: &zeroValue}
@@ -24003,6 +25488,26 @@ func TestWorkflowJob_GetConclusion(tt *testing.T) {
 	w.GetConclusion()
 }
 
+func TestWorkflowJob_GetCreatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	w := &WorkflowJob{CreatedAt: &zeroValue}
+	w.GetCreatedAt()
+	w = &WorkflowJob{}
+	w.GetCreatedAt()
+	w = nil
+	w.GetCreatedAt()
+}
+
+func TestWorkflowJob_GetHeadBranch(tt *testing.T) {
+	var zeroValue string
+	w := &WorkflowJob{HeadBranch: &zeroValue}
+	w.GetHeadBranch()
+	w = &WorkflowJob{}
+	w.GetHeadBranch()
+	w = nil
+	w.GetHeadBranch()
+}
+
 func TestWorkflowJob_GetHeadSHA(tt *testing.T) {
 	var zeroValue string
 	w := &WorkflowJob{HeadSHA: &zeroValue}
@@ -24053,6 +25558,16 @@ func TestWorkflowJob_GetNodeID(tt *testing.T) {
 	w.GetNodeID()
 }
 
+func TestWorkflowJob_GetRunAttempt(tt *testing.T) {
+	var zeroValue int64
+	w := &WorkflowJob{RunAttempt: &zeroValue}
+	w.GetRunAttempt()
+	w = &WorkflowJob{}
+	w.GetRunAttempt()
+	w = nil
+	w.GetRunAttempt()
+}
+
 func TestWorkflowJob_GetRunID(tt *testing.T) {
 	var zeroValue int64
 	w := &WorkflowJob{RunID: &zeroValue}
@@ -24143,6 +25658,16 @@ func TestWorkflowJob_GetURL(tt *testing.T) {
 	w.GetURL()
 }
 
+func TestWorkflowJob_GetWorkflowName(tt *testing.T) {
+	var zeroValue string
+	w := &WorkflowJob{WorkflowName: &zeroValue}
+	w.GetWorkflowName()
+	w = &WorkflowJob{}
+	w.GetWorkflowName()
+	w = nil
+	w.GetWorkflowName()
+}
+
 func TestWorkflowJobEvent_GetAction(tt *testing.T) {
 	var zeroValue string
 	w := &WorkflowJobEvent{Action: &zeroValue}
@@ -24506,27 +26031,6 @@ func TestWorkflowRunBill_GetTotalMS(tt *testing.T) {
 	w.GetTotalMS()
 }
 
-func TestWorkflowRunEnvironment_GetMacOS(tt *testing.T) {
-	w := &WorkflowRunEnvironment{}
-	w.GetMacOS()
-	w = nil
-	w.GetMacOS()
-}
-
-func TestWorkflowRunEnvironment_GetUbuntu(tt *testing.T) {
-	w := &WorkflowRunEnvironment{}
-	w.GetUbuntu()
-	w = nil
-	w.GetUbuntu()
-}
-
-func TestWorkflowRunEnvironment_GetWindows(tt *testing.T) {
-	w := &WorkflowRunEnvironment{}
-	w.GetWindows()
-	w = nil
-	w.GetWindows()
-}
-
 func TestWorkflowRunEvent_GetAction(tt *testing.T) {
 	var zeroValue string
 	w := &WorkflowRunEvent{Action: &zeroValue}
diff --git a/github/github-stringify_test.go b/github/github-stringify_test.go
index b83ff23..8a78fb0 100644
--- a/github/github-stringify_test.go
+++ b/github/github-stringify_test.go
@@ -268,11 +268,12 @@ func TestCommit_String(t *testing.T) {
 
 func TestCommitAuthor_String(t *testing.T) {
 	v := CommitAuthor{
+		Date:  &Timestamp{},
 		Name:  String(""),
 		Email: String(""),
 		Login: String(""),
 	}
-	want := `github.CommitAuthor{Name:"", Email:"", Login:""}`
+	want := `github.CommitAuthor{Date:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Name:"", Email:"", Login:""}`
 	if got := v.String(); got != want {
 		t.Errorf("CommitAuthor.String = %v, want %v", got, want)
 	}
@@ -400,14 +401,15 @@ func TestEnterprise_String(t *testing.T) {
 
 func TestEvent_String(t *testing.T) {
 	v := Event{
-		Type:   String(""),
-		Public: Bool(false),
-		Repo:   &Repository{},
-		Actor:  &User{},
-		Org:    &Organization{},
-		ID:     String(""),
+		Type:      String(""),
+		Public:    Bool(false),
+		Repo:      &Repository{},
+		Actor:     &User{},
+		Org:       &Organization{},
+		CreatedAt: &Timestamp{},
+		ID:        String(""),
 	}
-	want := `github.Event{Type:"", Public:false, Repo:github.Repository{}, Actor:github.User{}, Org:github.Organization{}, ID:""}`
+	want := `github.Event{Type:"", Public:false, Repo:github.Repository{}, Actor:github.User{}, Org:github.Organization{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ID:""}`
 	if got := v.String(); got != want {
 		t.Errorf("Event.String = %v, want %v", got, want)
 	}
@@ -424,8 +426,10 @@ func TestGPGKey_String(t *testing.T) {
 		CanEncryptComms:   Bool(false),
 		CanEncryptStorage: Bool(false),
 		CanCertify:        Bool(false),
+		CreatedAt:         &Timestamp{},
+		ExpiresAt:         &Timestamp{},
 	}
-	want := `github.GPGKey{ID:0, PrimaryKeyID:0, KeyID:"", RawKey:"", PublicKey:"", CanSign:false, CanEncryptComms:false, CanEncryptStorage:false, CanCertify:false}`
+	want := `github.GPGKey{ID:0, PrimaryKeyID:0, KeyID:"", RawKey:"", PublicKey:"", CanSign:false, CanEncryptComms:false, CanEncryptStorage:false, CanCertify:false, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ExpiresAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}`
 	if got := v.String(); got != want {
 		t.Errorf("GPGKey.String = %v, want %v", got, want)
 	}
@@ -441,9 +445,11 @@ func TestGist_String(t *testing.T) {
 		HTMLURL:     String(""),
 		GitPullURL:  String(""),
 		GitPushURL:  String(""),
+		CreatedAt:   &Timestamp{},
+		UpdatedAt:   &Timestamp{},
 		NodeID:      String(""),
 	}
-	want := `github.Gist{ID:"", Description:"", Public:false, Owner:github.User{}, Comments:0, HTMLURL:"", GitPullURL:"", GitPushURL:"", NodeID:""}`
+	want := `github.Gist{ID:"", Description:"", Public:false, Owner:github.User{}, Comments:0, HTMLURL:"", GitPullURL:"", GitPushURL:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, NodeID:""}`
 	if got := v.String(); got != want {
 		t.Errorf("Gist.String = %v, want %v", got, want)
 	}
@@ -451,12 +457,13 @@ func TestGist_String(t *testing.T) {
 
 func TestGistComment_String(t *testing.T) {
 	v := GistComment{
-		ID:   Int64(0),
-		URL:  String(""),
-		Body: String(""),
-		User: &User{},
+		ID:        Int64(0),
+		URL:       String(""),
+		Body:      String(""),
+		User:      &User{},
+		CreatedAt: &Timestamp{},
 	}
-	want := `github.GistComment{ID:0, URL:"", Body:"", User:github.User{}}`
+	want := `github.GistComment{ID:0, URL:"", Body:"", User:github.User{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}`
 	if got := v.String(); got != want {
 		t.Errorf("GistComment.String = %v, want %v", got, want)
 	}
@@ -580,16 +587,18 @@ func TestHeadCommit_String(t *testing.T) {
 
 func TestHook_String(t *testing.T) {
 	v := Hook{
-		URL:     String(""),
-		ID:      Int64(0),
-		Type:    String(""),
-		Name:    String(""),
-		TestURL: String(""),
-		PingURL: String(""),
-		Events:  []string{""},
-		Active:  Bool(false),
+		CreatedAt: &Timestamp{},
+		UpdatedAt: &Timestamp{},
+		URL:       String(""),
+		ID:        Int64(0),
+		Type:      String(""),
+		Name:      String(""),
+		TestURL:   String(""),
+		PingURL:   String(""),
+		Events:    []string{""},
+		Active:    Bool(false),
 	}
-	want := `github.Hook{URL:"", ID:0, Type:"", Name:"", TestURL:"", PingURL:"", Events:[""], Active:false}`
+	want := `github.Hook{CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, URL:"", ID:0, Type:"", Name:"", TestURL:"", PingURL:"", Events:[""], Active:false}`
 	if got := v.String(); got != want {
 		t.Errorf("Hook.String = %v, want %v", got, want)
 	}
@@ -696,13 +705,14 @@ func TestInvitation_String(t *testing.T) {
 		Login:             String(""),
 		Email:             String(""),
 		Role:              String(""),
+		CreatedAt:         &Timestamp{},
 		Inviter:           &User{},
 		TeamCount:         Int(0),
 		InvitationTeamURL: String(""),
 		FailedAt:          &Timestamp{},
 		FailedReason:      String(""),
 	}
-	want := `github.Invitation{ID:0, NodeID:"", Login:"", Email:"", Role:"", Inviter:github.User{}, TeamCount:0, InvitationTeamURL:"", FailedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, FailedReason:""}`
+	want := `github.Invitation{ID:0, NodeID:"", Login:"", Email:"", Role:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Inviter:github.User{}, TeamCount:0, InvitationTeamURL:"", FailedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, FailedReason:""}`
 	if got := v.String(); got != want {
 		t.Errorf("Invitation.String = %v, want %v", got, want)
 	}
@@ -713,6 +723,7 @@ func TestIssue_String(t *testing.T) {
 		ID:                Int64(0),
 		Number:            Int(0),
 		State:             String(""),
+		StateReason:       String(""),
 		Locked:            Bool(false),
 		Title:             String(""),
 		Body:              String(""),
@@ -720,6 +731,9 @@ func TestIssue_String(t *testing.T) {
 		User:              &User{},
 		Assignee:          &User{},
 		Comments:          Int(0),
+		ClosedAt:          &Timestamp{},
+		CreatedAt:         &Timestamp{},
+		UpdatedAt:         &Timestamp{},
 		ClosedBy:          &User{},
 		URL:               String(""),
 		HTMLURL:           String(""),
@@ -734,7 +748,7 @@ func TestIssue_String(t *testing.T) {
 		NodeID:            String(""),
 		ActiveLockReason:  String(""),
 	}
-	want := `github.Issue{ID:0, Number:0, State:"", Locked:false, Title:"", Body:"", AuthorAssociation:"", User:github.User{}, Assignee:github.User{}, Comments:0, ClosedBy:github.User{}, URL:"", HTMLURL:"", CommentsURL:"", EventsURL:"", LabelsURL:"", RepositoryURL:"", Milestone:github.Milestone{}, PullRequestLinks:github.PullRequestLinks{}, Repository:github.Repository{}, Reactions:github.Reactions{}, NodeID:"", ActiveLockReason:""}`
+	want := `github.Issue{ID:0, Number:0, State:"", StateReason:"", Locked:false, Title:"", Body:"", AuthorAssociation:"", User:github.User{}, Assignee:github.User{}, Comments:0, ClosedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ClosedBy:github.User{}, URL:"", HTMLURL:"", CommentsURL:"", EventsURL:"", LabelsURL:"", RepositoryURL:"", Milestone:github.Milestone{}, PullRequestLinks:github.PullRequestLinks{}, Repository:github.Repository{}, Reactions:github.Reactions{}, NodeID:"", ActiveLockReason:""}`
 	if got := v.String(); got != want {
 		t.Errorf("Issue.String = %v, want %v", got, want)
 	}
@@ -747,12 +761,14 @@ func TestIssueComment_String(t *testing.T) {
 		Body:              String(""),
 		User:              &User{},
 		Reactions:         &Reactions{},
+		CreatedAt:         &Timestamp{},
+		UpdatedAt:         &Timestamp{},
 		AuthorAssociation: String(""),
 		URL:               String(""),
 		HTMLURL:           String(""),
 		IssueURL:          String(""),
 	}
-	want := `github.IssueComment{ID:0, NodeID:"", Body:"", User:github.User{}, Reactions:github.Reactions{}, AuthorAssociation:"", URL:"", HTMLURL:"", IssueURL:""}`
+	want := `github.IssueComment{ID:0, NodeID:"", Body:"", User:github.User{}, Reactions:github.Reactions{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, AuthorAssociation:"", URL:"", HTMLURL:"", IssueURL:""}`
 	if got := v.String(); got != want {
 		t.Errorf("IssueComment.String = %v, want %v", got, want)
 	}
@@ -779,8 +795,10 @@ func TestKey_String(t *testing.T) {
 		ReadOnly:  Bool(false),
 		Verified:  Bool(false),
 		CreatedAt: &Timestamp{},
+		AddedBy:   String(""),
+		LastUsed:  &Timestamp{},
 	}
-	want := `github.Key{ID:0, Key:"", URL:"", Title:"", ReadOnly:false, Verified:false, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}`
+	want := `github.Key{ID:0, Key:"", URL:"", Title:"", ReadOnly:false, Verified:false, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, AddedBy:"", LastUsed:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}`
 	if got := v.String(); got != want {
 		t.Errorf("Key.String = %v, want %v", got, want)
 	}
@@ -894,9 +912,13 @@ func TestMilestone_String(t *testing.T) {
 		Creator:      &User{},
 		OpenIssues:   Int(0),
 		ClosedIssues: Int(0),
+		CreatedAt:    &Timestamp{},
+		UpdatedAt:    &Timestamp{},
+		ClosedAt:     &Timestamp{},
+		DueOn:        &Timestamp{},
 		NodeID:       String(""),
 	}
-	want := `github.Milestone{URL:"", HTMLURL:"", LabelsURL:"", ID:0, Number:0, State:"", Title:"", Description:"", Creator:github.User{}, OpenIssues:0, ClosedIssues:0, NodeID:""}`
+	want := `github.Milestone{URL:"", HTMLURL:"", LabelsURL:"", ID:0, Number:0, State:"", Title:"", Description:"", Creator:github.User{}, OpenIssues:0, ClosedIssues:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ClosedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, DueOn:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, NodeID:""}`
 	if got := v.String(); got != want {
 		t.Errorf("Milestone.String = %v, want %v", got, want)
 	}
@@ -974,8 +996,10 @@ func TestOrganization_String(t *testing.T) {
 		PublicGists:                          Int(0),
 		Followers:                            Int(0),
 		Following:                            Int(0),
-		TotalPrivateRepos:                    Int(0),
-		OwnedPrivateRepos:                    Int(0),
+		CreatedAt:                            &Timestamp{},
+		UpdatedAt:                            &Timestamp{},
+		TotalPrivateRepos:                    Int64(0),
+		OwnedPrivateRepos:                    Int64(0),
 		PrivateGists:                         Int(0),
 		DiskUsage:                            Int(0),
 		Collaborators:                        Int(0),
@@ -1012,7 +1036,7 @@ func TestOrganization_String(t *testing.T) {
 		PublicMembersURL: String(""),
 		ReposURL:         String(""),
 	}
-	want := `github.Organization{Login:"", ID:0, NodeID:"", AvatarURL:"", HTMLURL:"", Name:"", Company:"", Blog:"", Location:"", Email:"", TwitterUsername:"", Description:"", PublicRepos:0, PublicGists:0, Followers:0, Following:0, TotalPrivateRepos:0, OwnedPrivateRepos:0, PrivateGists:0, DiskUsage:0, Collaborators:0, BillingEmail:"", Type:"", Plan:github.Plan{}, TwoFactorRequirementEnabled:false, IsVerified:false, HasOrganizationProjects:false, HasRepositoryProjects:false, DefaultRepoPermission:"", DefaultRepoSettings:"", MembersCanCreateRepos:false, MembersCanCreatePublicRepos:false, MembersCanCreatePrivateRepos:false, MembersCanCreateInternalRepos:false, MembersCanForkPrivateRepos:false, MembersAllowedRepositoryCreationType:"", MembersCanCreatePages:false, MembersCanCreatePublicPages:false, MembersCanCreatePrivatePages:false, WebCommitSignoffRequired:false, AdvancedSecurityEnabledForNewRepos:false, DependabotAlertsEnabledForNewRepos:false, DependabotSecurityUpdatesEnabledForNewRepos:false, DependencyGraphEnabledForNewRepos:false, SecretScanningEnabledForNewRepos:false, SecretScanningPushProtectionEnabledForNewRepos:false, URL:"", EventsURL:"", HooksURL:"", IssuesURL:"", MembersURL:"", PublicMembersURL:"", ReposURL:""}`
+	want := `github.Organization{Login:"", ID:0, NodeID:"", AvatarURL:"", HTMLURL:"", Name:"", Company:"", Blog:"", Location:"", Email:"", TwitterUsername:"", Description:"", PublicRepos:0, PublicGists:0, Followers:0, Following:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, TotalPrivateRepos:0, OwnedPrivateRepos:0, PrivateGists:0, DiskUsage:0, Collaborators:0, BillingEmail:"", Type:"", Plan:github.Plan{}, TwoFactorRequirementEnabled:false, IsVerified:false, HasOrganizationProjects:false, HasRepositoryProjects:false, DefaultRepoPermission:"", DefaultRepoSettings:"", MembersCanCreateRepos:false, MembersCanCreatePublicRepos:false, MembersCanCreatePrivateRepos:false, MembersCanCreateInternalRepos:false, MembersCanForkPrivateRepos:false, MembersAllowedRepositoryCreationType:"", MembersCanCreatePages:false, MembersCanCreatePublicPages:false, MembersCanCreatePrivatePages:false, WebCommitSignoffRequired:false, AdvancedSecurityEnabledForNewRepos:false, DependabotAlertsEnabledForNewRepos:false, DependabotSecurityUpdatesEnabledForNewRepos:false, DependencyGraphEnabledForNewRepos:false, SecretScanningEnabledForNewRepos:false, SecretScanningPushProtectionEnabledForNewRepos:false, URL:"", EventsURL:"", HooksURL:"", IssuesURL:"", MembersURL:"", PublicMembersURL:"", ReposURL:""}`
 	if got := v.String(); got != want {
 		t.Errorf("Organization.String = %v, want %v", got, want)
 	}
@@ -1161,7 +1185,7 @@ func TestPlan_String(t *testing.T) {
 		Name:          String(""),
 		Space:         Int(0),
 		Collaborators: Int(0),
-		PrivateRepos:  Int(0),
+		PrivateRepos:  Int64(0),
 		FilledSeats:   Int(0),
 		Seats:         Int(0),
 	}
@@ -1216,6 +1240,10 @@ func TestPullRequest_String(t *testing.T) {
 		Locked:              Bool(false),
 		Title:               String(""),
 		Body:                String(""),
+		CreatedAt:           &Timestamp{},
+		UpdatedAt:           &Timestamp{},
+		ClosedAt:            &Timestamp{},
+		MergedAt:            &Timestamp{},
 		User:                &User{},
 		Draft:               Bool(false),
 		Merged:              Bool(false),
@@ -1251,7 +1279,7 @@ func TestPullRequest_String(t *testing.T) {
 		Base:                &PullRequestBranch{},
 		ActiveLockReason:    String(""),
 	}
-	want := `github.PullRequest{ID:0, Number:0, State:"", Locked:false, Title:"", Body:"", User:github.User{}, Draft:false, Merged:false, Mergeable:false, MergeableState:"", MergedBy:github.User{}, MergeCommitSHA:"", Rebaseable:false, Comments:0, Commits:0, Additions:0, Deletions:0, ChangedFiles:0, URL:"", HTMLURL:"", IssueURL:"", StatusesURL:"", DiffURL:"", PatchURL:"", CommitsURL:"", CommentsURL:"", ReviewCommentsURL:"", ReviewCommentURL:"", ReviewComments:0, Assignee:github.User{}, Milestone:github.Milestone{}, MaintainerCanModify:false, AuthorAssociation:"", NodeID:"", AutoMerge:github.PullRequestAutoMerge{}, Links:github.PRLinks{}, Head:github.PullRequestBranch{}, Base:github.PullRequestBranch{}, ActiveLockReason:""}`
+	want := `github.PullRequest{ID:0, Number:0, State:"", Locked:false, Title:"", Body:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ClosedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, MergedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, User:github.User{}, Draft:false, Merged:false, Mergeable:false, MergeableState:"", MergedBy:github.User{}, MergeCommitSHA:"", Rebaseable:false, Comments:0, Commits:0, Additions:0, Deletions:0, ChangedFiles:0, URL:"", HTMLURL:"", IssueURL:"", StatusesURL:"", DiffURL:"", PatchURL:"", CommitsURL:"", CommentsURL:"", ReviewCommentsURL:"", ReviewCommentURL:"", ReviewComments:0, Assignee:github.User{}, Milestone:github.Milestone{}, MaintainerCanModify:false, AuthorAssociation:"", NodeID:"", AutoMerge:github.PullRequestAutoMerge{}, Links:github.PRLinks{}, Head:github.PullRequestBranch{}, Base:github.PullRequestBranch{}, ActiveLockReason:""}`
 	if got := v.String(); got != want {
 		t.Errorf("PullRequest.String = %v, want %v", got, want)
 	}
@@ -1278,12 +1306,14 @@ func TestPullRequestComment_String(t *testing.T) {
 		OriginalCommitID:    String(""),
 		User:                &User{},
 		Reactions:           &Reactions{},
+		CreatedAt:           &Timestamp{},
+		UpdatedAt:           &Timestamp{},
 		AuthorAssociation:   String(""),
 		URL:                 String(""),
 		HTMLURL:             String(""),
 		PullRequestURL:      String(""),
 	}
-	want := `github.PullRequestComment{ID:0, NodeID:"", InReplyTo:0, Body:"", Path:"", DiffHunk:"", PullRequestReviewID:0, Position:0, OriginalPosition:0, StartLine:0, Line:0, OriginalLine:0, OriginalStartLine:0, Side:"", StartSide:"", CommitID:"", OriginalCommitID:"", User:github.User{}, Reactions:github.Reactions{}, AuthorAssociation:"", URL:"", HTMLURL:"", PullRequestURL:""}`
+	want := `github.PullRequestComment{ID:0, NodeID:"", InReplyTo:0, Body:"", Path:"", DiffHunk:"", PullRequestReviewID:0, Position:0, OriginalPosition:0, StartLine:0, Line:0, OriginalLine:0, OriginalStartLine:0, Side:"", StartSide:"", CommitID:"", OriginalCommitID:"", User:github.User{}, Reactions:github.Reactions{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, AuthorAssociation:"", URL:"", HTMLURL:"", PullRequestURL:""}`
 	if got := v.String(); got != want {
 		t.Errorf("PullRequestComment.String = %v, want %v", got, want)
 	}
@@ -1295,13 +1325,14 @@ func TestPullRequestReview_String(t *testing.T) {
 		NodeID:            String(""),
 		User:              &User{},
 		Body:              String(""),
+		SubmittedAt:       &Timestamp{},
 		CommitID:          String(""),
 		HTMLURL:           String(""),
 		PullRequestURL:    String(""),
 		State:             String(""),
 		AuthorAssociation: String(""),
 	}
-	want := `github.PullRequestReview{ID:0, NodeID:"", User:github.User{}, Body:"", CommitID:"", HTMLURL:"", PullRequestURL:"", State:"", AuthorAssociation:""}`
+	want := `github.PullRequestReview{ID:0, NodeID:"", User:github.User{}, Body:"", SubmittedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, CommitID:"", HTMLURL:"", PullRequestURL:"", State:"", AuthorAssociation:""}`
 	if got := v.String(); got != want {
 		t.Errorf("PullRequestReview.String = %v, want %v", got, want)
 	}
@@ -1479,8 +1510,10 @@ func TestRepoStatus_String(t *testing.T) {
 		Context:     String(""),
 		AvatarURL:   String(""),
 		Creator:     &User{},
+		CreatedAt:   &Timestamp{},
+		UpdatedAt:   &Timestamp{},
 	}
-	want := `github.RepoStatus{ID:0, NodeID:"", URL:"", State:"", TargetURL:"", Description:"", Context:"", AvatarURL:"", Creator:github.User{}}`
+	want := `github.RepoStatus{ID:0, NodeID:"", URL:"", State:"", TargetURL:"", Description:"", Context:"", AvatarURL:"", Creator:github.User{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}`
 	if got := v.String(); got != want {
 		t.Errorf("RepoStatus.String = %v, want %v", got, want)
 	}
@@ -1529,6 +1562,7 @@ func TestRepository_String(t *testing.T) {
 		AllowMergeCommit:          Bool(false),
 		AllowAutoMerge:            Bool(false),
 		AllowForking:              Bool(false),
+		WebCommitSignoffRequired:  Bool(false),
 		DeleteBranchOnMerge:       Bool(false),
 		UseSquashPRTitleAsDefault: Bool(false),
 		SquashMergeCommitTitle:    String(""),
@@ -1545,6 +1579,7 @@ func TestRepository_String(t *testing.T) {
 		HasPages:                  Bool(false),
 		HasProjects:               Bool(false),
 		HasDownloads:              Bool(false),
+		HasDiscussions:            Bool(false),
 		IsTemplate:                Bool(false),
 		LicenseTemplate:           String(""),
 		GitignoreTemplate:         String(""),
@@ -1590,7 +1625,7 @@ func TestRepository_String(t *testing.T) {
 		Visibility:                String(""),
 		RoleName:                  String(""),
 	}
-	want := `github.Repository{ID:0, NodeID:"", Owner:github.User{}, Name:"", FullName:"", Description:"", Homepage:"", CodeOfConduct:github.CodeOfConduct{}, DefaultBranch:"", MasterBranch:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, PushedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, HTMLURL:"", CloneURL:"", GitURL:"", MirrorURL:"", SSHURL:"", SVNURL:"", Language:"", Fork:false, ForksCount:0, NetworkCount:0, OpenIssuesCount:0, OpenIssues:0, StargazersCount:0, SubscribersCount:0, WatchersCount:0, Watchers:0, Size:0, AutoInit:false, Parent:github.Repository{}, Source:github.Repository{}, TemplateRepository:github.Repository{}, Organization:github.Organization{}, AllowRebaseMerge:false, AllowUpdateBranch:false, AllowSquashMerge:false, AllowMergeCommit:false, AllowAutoMerge:false, AllowForking:false, DeleteBranchOnMerge:false, UseSquashPRTitleAsDefault:false, SquashMergeCommitTitle:"", SquashMergeCommitMessage:"", MergeCommitTitle:"", MergeCommitMessage:"", Topics:[""], Archived:false, Disabled:false, License:github.License{}, Private:false, HasIssues:false, HasWiki:false, HasPages:false, HasProjects:false, HasDownloads:false, IsTemplate:false, LicenseTemplate:"", GitignoreTemplate:"", SecurityAndAnalysis:github.SecurityAndAnalysis{}, TeamID:0, URL:"", ArchiveURL:"", AssigneesURL:"", BlobsURL:"", BranchesURL:"", CollaboratorsURL:"", CommentsURL:"", CommitsURL:"", CompareURL:"", ContentsURL:"", ContributorsURL:"", DeploymentsURL:"", DownloadsURL:"", EventsURL:"", ForksURL:"", GitCommitsURL:"", GitRefsURL:"", GitTagsURL:"", HooksURL:"", IssueCommentURL:"", IssueEventsURL:"", IssuesURL:"", KeysURL:"", LabelsURL:"", LanguagesURL:"", MergesURL:"", MilestonesURL:"", NotificationsURL:"", PullsURL:"", ReleasesURL:"", StargazersURL:"", StatusesURL:"", SubscribersURL:"", SubscriptionURL:"", TagsURL:"", TreesURL:"", TeamsURL:"", Visibility:"", RoleName:""}`
+	want := `github.Repository{ID:0, NodeID:"", Owner:github.User{}, Name:"", FullName:"", Description:"", Homepage:"", CodeOfConduct:github.CodeOfConduct{}, DefaultBranch:"", MasterBranch:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, PushedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, HTMLURL:"", CloneURL:"", GitURL:"", MirrorURL:"", SSHURL:"", SVNURL:"", Language:"", Fork:false, ForksCount:0, NetworkCount:0, OpenIssuesCount:0, OpenIssues:0, StargazersCount:0, SubscribersCount:0, WatchersCount:0, Watchers:0, Size:0, AutoInit:false, Parent:github.Repository{}, Source:github.Repository{}, TemplateRepository:github.Repository{}, Organization:github.Organization{}, AllowRebaseMerge:false, AllowUpdateBranch:false, AllowSquashMerge:false, AllowMergeCommit:false, AllowAutoMerge:false, AllowForking:false, WebCommitSignoffRequired:false, DeleteBranchOnMerge:false, UseSquashPRTitleAsDefault:false, SquashMergeCommitTitle:"", SquashMergeCommitMessage:"", MergeCommitTitle:"", MergeCommitMessage:"", Topics:[""], Archived:false, Disabled:false, License:github.License{}, Private:false, HasIssues:false, HasWiki:false, HasPages:false, HasProjects:false, HasDownloads:false, HasDiscussions:false, IsTemplate:false, LicenseTemplate:"", GitignoreTemplate:"", SecurityAndAnalysis:github.SecurityAndAnalysis{}, TeamID:0, URL:"", ArchiveURL:"", AssigneesURL:"", BlobsURL:"", BranchesURL:"", CollaboratorsURL:"", CommentsURL:"", CommitsURL:"", CompareURL:"", ContentsURL:"", ContributorsURL:"", DeploymentsURL:"", DownloadsURL:"", EventsURL:"", ForksURL:"", GitCommitsURL:"", GitRefsURL:"", GitTagsURL:"", HooksURL:"", IssueCommentURL:"", IssueEventsURL:"", IssuesURL:"", KeysURL:"", LabelsURL:"", LanguagesURL:"", MergesURL:"", MilestonesURL:"", NotificationsURL:"", PullsURL:"", ReleasesURL:"", StargazersURL:"", StatusesURL:"", SubscribersURL:"", SubscriptionURL:"", TagsURL:"", TreesURL:"", TeamsURL:"", Visibility:"", RoleName:""}`
 	if got := v.String(); got != want {
 		t.Errorf("Repository.String = %v, want %v", got, want)
 	}
@@ -1605,11 +1640,13 @@ func TestRepositoryComment_String(t *testing.T) {
 		CommitID:  String(""),
 		User:      &User{},
 		Reactions: &Reactions{},
+		CreatedAt: &Timestamp{},
+		UpdatedAt: &Timestamp{},
 		Body:      String(""),
 		Path:      String(""),
 		Position:  Int(0),
 	}
-	want := `github.RepositoryComment{HTMLURL:"", URL:"", ID:0, NodeID:"", CommitID:"", User:github.User{}, Reactions:github.Reactions{}, Body:"", Path:"", Position:0}`
+	want := `github.RepositoryComment{HTMLURL:"", URL:"", ID:0, NodeID:"", CommitID:"", User:github.User{}, Reactions:github.Reactions{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Body:"", Path:"", Position:0}`
 	if got := v.String(); got != want {
 		t.Errorf("RepositoryComment.String = %v, want %v", got, want)
 	}
@@ -1694,6 +1731,7 @@ func TestRepositoryRelease_String(t *testing.T) {
 		Body:                   String(""),
 		Draft:                  Bool(false),
 		Prerelease:             Bool(false),
+		MakeLatest:             String(""),
 		DiscussionCategoryName: String(""),
 		GenerateReleaseNotes:   Bool(false),
 		ID:                     Int64(0),
@@ -1708,7 +1746,7 @@ func TestRepositoryRelease_String(t *testing.T) {
 		Author:                 &User{},
 		NodeID:                 String(""),
 	}
-	want := `github.RepositoryRelease{TagName:"", TargetCommitish:"", Name:"", Body:"", Draft:false, Prerelease:false, DiscussionCategoryName:"", GenerateReleaseNotes:false, ID:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, PublishedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, URL:"", HTMLURL:"", AssetsURL:"", UploadURL:"", ZipballURL:"", TarballURL:"", Author:github.User{}, NodeID:""}`
+	want := `github.RepositoryRelease{TagName:"", TargetCommitish:"", Name:"", Body:"", Draft:false, Prerelease:false, MakeLatest:"", DiscussionCategoryName:"", GenerateReleaseNotes:false, ID:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, PublishedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, URL:"", HTMLURL:"", AssetsURL:"", UploadURL:"", ZipballURL:"", TarballURL:"", Author:github.User{}, NodeID:""}`
 	if got := v.String(); got != want {
 		t.Errorf("RepositoryRelease.String = %v, want %v", got, want)
 	}
@@ -1913,8 +1951,8 @@ func TestUser_String(t *testing.T) {
 		SuspendedAt:             &Timestamp{},
 		Type:                    String(""),
 		SiteAdmin:               Bool(false),
-		TotalPrivateRepos:       Int(0),
-		OwnedPrivateRepos:       Int(0),
+		TotalPrivateRepos:       Int64(0),
+		OwnedPrivateRepos:       Int64(0),
 		PrivateGists:            Int(0),
 		DiskUsage:               Int(0),
 		Collaborators:           Int(0),
diff --git a/github/github.go b/github/github.go
index 38a5bcd..2127a52 100644
--- a/github/github.go
+++ b/github/github.go
@@ -24,15 +24,18 @@ import (
 	"time"
 
 	"github.com/google/go-querystring/query"
+	"golang.org/x/oauth2"
 )
 
 const (
-	Version = "v48.0.0"
+	Version = "v52.0.0"
 
-	defaultBaseURL   = "https://api.github.com/"
-	defaultUserAgent = "go-github" + "/" + Version
-	uploadBaseURL    = "https://uploads.github.com/"
+	defaultAPIVersion = "2022-11-28"
+	defaultBaseURL    = "https://api.github.com/"
+	defaultUserAgent  = "go-github" + "/" + Version
+	uploadBaseURL     = "https://uploads.github.com/"
 
+	headerAPIVersion    = "X-GitHub-Api-Version"
 	headerRateLimit     = "X-RateLimit-Limit"
 	headerRateRemaining = "X-RateLimit-Remaining"
 	headerRateReset     = "X-RateLimit-Reset"
@@ -168,8 +171,9 @@ type Client struct {
 	// User agent used when communicating with the GitHub API.
 	UserAgent string
 
-	rateMu     sync.Mutex
-	rateLimits [categories]Rate // Rate limits for the client as determined by the most recent API calls.
+	rateMu                  sync.Mutex
+	rateLimits              [categories]Rate // Rate limits for the client as determined by the most recent API calls.
+	secondaryRateLimitReset time.Time        // Secondary rate limit reset for the client as determined by the most recent API calls.
 
 	common service // Reuse a single struct instead of allocating one for each service on the heap.
 
@@ -344,6 +348,16 @@ func NewClient(httpClient *http.Client) *Client {
 	return c
 }
 
+// NewClientWithEnvProxy enhances NewClient with the HttpProxy env.
+func NewClientWithEnvProxy() *Client {
+	return NewClient(&http.Client{Transport: &http.Transport{Proxy: http.ProxyFromEnvironment}})
+}
+
+// NewTokenClient returns a new GitHub API client authenticated with the provided token.
+func NewTokenClient(ctx context.Context, token string) *Client {
+	return NewClient(oauth2.NewClient(ctx, oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})))
+}
+
 // NewEnterpriseClient returns a new GitHub API client with provided
 // base URL and upload URL (often is your GitHub Enterprise hostname).
 // If the base URL does not have the suffix "/api/v3/", it will be added automatically.
@@ -392,12 +406,24 @@ func NewEnterpriseClient(baseURL, uploadURL string, httpClient *http.Client) (*C
 	return c, nil
 }
 
+// RequestOption represents an option that can modify an http.Request.
+type RequestOption func(req *http.Request)
+
+// WithVersion overrides the GitHub v3 API version for this individual request.
+// For more information, see:
+// https://github.blog/2022-11-28-to-infinity-and-beyond-enabling-the-future-of-githubs-rest-api-with-api-versioning/
+func WithVersion(version string) RequestOption {
+	return func(req *http.Request) {
+		req.Header.Set(headerAPIVersion, version)
+	}
+}
+
 // NewRequest creates an API request. A relative URL can be provided in urlStr,
 // in which case it is resolved relative to the BaseURL of the Client.
 // Relative URLs should always be specified without a preceding slash. If
 // specified, the value pointed to by body is JSON encoded and included as the
 // request body.
-func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Request, error) {
+func (c *Client) NewRequest(method, urlStr string, body interface{}, opts ...RequestOption) (*http.Request, error) {
 	if !strings.HasSuffix(c.BaseURL.Path, "/") {
 		return nil, fmt.Errorf("BaseURL must have a trailing slash, but %q does not", c.BaseURL)
 	}
@@ -430,6 +456,12 @@ func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Requ
 	if c.UserAgent != "" {
 		req.Header.Set("User-Agent", c.UserAgent)
 	}
+	req.Header.Set(headerAPIVersion, defaultAPIVersion)
+
+	for _, opt := range opts {
+		opt(req)
+	}
+
 	return req, nil
 }
 
@@ -437,7 +469,7 @@ func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Requ
 // in which case it is resolved relative to the BaseURL of the Client.
 // Relative URLs should always be specified without a preceding slash.
 // Body is sent with Content-Type: application/x-www-form-urlencoded.
-func (c *Client) NewFormRequest(urlStr string, body io.Reader) (*http.Request, error) {
+func (c *Client) NewFormRequest(urlStr string, body io.Reader, opts ...RequestOption) (*http.Request, error) {
 	if !strings.HasSuffix(c.BaseURL.Path, "/") {
 		return nil, fmt.Errorf("BaseURL must have a trailing slash, but %q does not", c.BaseURL)
 	}
@@ -457,13 +489,19 @@ func (c *Client) NewFormRequest(urlStr string, body io.Reader) (*http.Request, e
 	if c.UserAgent != "" {
 		req.Header.Set("User-Agent", c.UserAgent)
 	}
+	req.Header.Set(headerAPIVersion, defaultAPIVersion)
+
+	for _, opt := range opts {
+		opt(req)
+	}
+
 	return req, nil
 }
 
 // NewUploadRequest creates an upload request. A relative URL can be provided in
 // urlStr, in which case it is resolved relative to the UploadURL of the Client.
 // Relative URLs should always be specified without a preceding slash.
-func (c *Client) NewUploadRequest(urlStr string, reader io.Reader, size int64, mediaType string) (*http.Request, error) {
+func (c *Client) NewUploadRequest(urlStr string, reader io.Reader, size int64, mediaType string, opts ...RequestOption) (*http.Request, error) {
 	if !strings.HasSuffix(c.UploadURL.Path, "/") {
 		return nil, fmt.Errorf("UploadURL must have a trailing slash, but %q does not", c.UploadURL)
 	}
@@ -485,6 +523,12 @@ func (c *Client) NewUploadRequest(urlStr string, reader io.Reader, size int64, m
 	req.Header.Set("Content-Type", mediaType)
 	req.Header.Set("Accept", mediaTypeV3)
 	req.Header.Set("User-Agent", c.UserAgent)
+	req.Header.Set(headerAPIVersion, defaultAPIVersion)
+
+	for _, opt := range opts {
+		opt(req)
+	}
+
 	return req, nil
 }
 
@@ -532,7 +576,8 @@ type Response struct {
 	// propagate to Response.
 	Rate Rate
 
-	// token's expiration date
+	// token's expiration date. Timestamp is 0001-01-01 when token doesn't expire.
+	// So it is valid for TokenExpiration.Equal(Timestamp{}) or TokenExpiration.Time.After(time.Now())
 	TokenExpiration Timestamp
 }
 
@@ -633,14 +678,19 @@ func parseRate(r *http.Response) Rate {
 }
 
 // parseTokenExpiration parses the TokenExpiration related headers.
+// Returns 0001-01-01 if the header is not defined or could not be parsed.
 func parseTokenExpiration(r *http.Response) Timestamp {
-	var exp Timestamp
 	if v := r.Header.Get(headerTokenExpiration); v != "" {
-		if t, err := time.Parse("2006-01-02 03:04:05 MST", v); err == nil {
-			exp = Timestamp{t.Local()}
+		if t, err := time.Parse("2006-01-02 15:04:05 MST", v); err == nil {
+			return Timestamp{t.Local()}
+		}
+		// Some tokens include the timezone offset instead of the timezone.
+		// https://github.com/google/go-github/issues/2649
+		if t, err := time.Parse("2006-01-02 15:04:05 -0700", v); err == nil {
+			return Timestamp{t.Local()}
 		}
 	}
-	return exp
+	return Timestamp{} // 0001-01-01 00:00:00
 }
 
 type requestContext uint8
@@ -664,7 +714,7 @@ func (c *Client) BareDo(ctx context.Context, req *http.Request) (*Response, erro
 
 	req = withContext(ctx, req)
 
-	rateLimitCategory := category(req.URL.Path)
+	rateLimitCategory := category(req.Method, req.URL.Path)
 
 	if bypass := ctx.Value(bypassRateLimitCheck); bypass == nil {
 		// If we've hit rate limit, don't make further requests before Reset time.
@@ -674,6 +724,12 @@ func (c *Client) BareDo(ctx context.Context, req *http.Request) (*Response, erro
 				Rate:     err.Rate,
 			}, err
 		}
+		// If we've hit a secondary rate limit, don't make further requests before Retry After.
+		if err := c.checkSecondaryRateLimitBeforeDo(ctx, req); err != nil {
+			return &Response{
+				Response: err.Response,
+			}, err
+		}
 	}
 
 	resp, err := c.client.Do(req)
@@ -725,6 +781,14 @@ func (c *Client) BareDo(ctx context.Context, req *http.Request) (*Response, erro
 			aerr.Raw = b
 			err = aerr
 		}
+
+		// Update the secondary rate limit if we hit it.
+		rerr, ok := err.(*AbuseRateLimitError)
+		if ok && rerr.RetryAfter != nil {
+			c.rateMu.Lock()
+			c.secondaryRateLimitReset = time.Now().Add(*rerr.RetryAfter)
+			c.rateMu.Unlock()
+		}
 	}
 	return response, err
 }
@@ -789,6 +853,35 @@ func (c *Client) checkRateLimitBeforeDo(req *http.Request, rateLimitCategory rat
 	return nil
 }
 
+// checkSecondaryRateLimitBeforeDo does not make any network calls, but uses existing knowledge from
+// current client state in order to quickly check if *AbuseRateLimitError can be immediately returned
+// from Client.Do, and if so, returns it so that Client.Do can skip making a network API call unnecessarily.
+// Otherwise it returns nil, and Client.Do should proceed normally.
+func (c *Client) checkSecondaryRateLimitBeforeDo(ctx context.Context, req *http.Request) *AbuseRateLimitError {
+	c.rateMu.Lock()
+	secondary := c.secondaryRateLimitReset
+	c.rateMu.Unlock()
+	if !secondary.IsZero() && time.Now().Before(secondary) {
+		// Create a fake response.
+		resp := &http.Response{
+			Status:     http.StatusText(http.StatusForbidden),
+			StatusCode: http.StatusForbidden,
+			Request:    req,
+			Header:     make(http.Header),
+			Body:       io.NopCloser(strings.NewReader("")),
+		}
+
+		retryAfter := time.Until(secondary)
+		return &AbuseRateLimitError{
+			Response:   resp,
+			Message:    fmt.Sprintf("API secondary rate limit exceeded until %v, not making remote request.", secondary),
+			RetryAfter: &retryAfter,
+		}
+	}
+
+	return nil
+}
+
 // compareHTTPResponse returns whether two http.Response objects are equal or not.
 // Currently, only StatusCode is checked. This function is used when implementing the
 // Is(error) bool interface for the custom error types in this package.
@@ -809,7 +902,7 @@ An ErrorResponse reports one or more errors caused by an API request.
 GitHub API docs: https://docs.github.com/en/rest/#client-errors
 */
 type ErrorResponse struct {
-	Response *http.Response // HTTP response that caused this error
+	Response *http.Response `json:"-"`       // HTTP response that caused this error
 	Message  string         `json:"message"` // error message
 	Errors   []Error        `json:"errors"`  // more detail on individual errors
 	// Block is only populated on certain types of errors such as code 451.
@@ -1159,13 +1252,36 @@ const (
 	categories // An array of this length will be able to contain all rate limit categories.
 )
 
-// category returns the rate limit category of the endpoint, determined by Request.URL.Path.
-func category(path string) rateLimitCategory {
+// category returns the rate limit category of the endpoint, determined by HTTP method and Request.URL.Path.
+func category(method, path string) rateLimitCategory {
 	switch {
+	// https://docs.github.com/en/rest/rate-limit#about-rate-limits
 	default:
+		// NOTE: coreCategory is returned for actionsRunnerRegistrationCategory too,
+		// because no API found for this category.
 		return coreCategory
 	case strings.HasPrefix(path, "/search/"):
 		return searchCategory
+	case path == "/graphql":
+		return graphqlCategory
+	case strings.HasPrefix(path, "/app-manifests/") &&
+		strings.HasSuffix(path, "/conversions") &&
+		method == http.MethodPost:
+		return integrationManifestCategory
+
+	// https://docs.github.com/en/rest/migrations/source-imports#start-an-import
+	case strings.HasPrefix(path, "/repos/") &&
+		strings.HasSuffix(path, "/import") &&
+		method == http.MethodPut:
+		return sourceImportCategory
+
+	// https://docs.github.com/en/rest/code-scanning#upload-an-analysis-as-sarif-data
+	case strings.HasSuffix(path, "/code-scanning/sarifs"):
+		return codeScanningUploadCategory
+
+	// https://docs.github.com/en/enterprise-cloud@latest/rest/scim
+	case strings.HasPrefix(path, "/scim/"):
+		return scimCategory
 	}
 }
 
@@ -1358,8 +1474,8 @@ func formatRateReset(d time.Duration) string {
 
 // When using roundTripWithOptionalFollowRedirect, note that it
 // is the responsibility of the caller to close the response body.
-func (c *Client) roundTripWithOptionalFollowRedirect(ctx context.Context, u string, followRedirects bool) (*http.Response, error) {
-	req, err := c.NewRequest("GET", u, nil)
+func (c *Client) roundTripWithOptionalFollowRedirect(ctx context.Context, u string, followRedirects bool, opts ...RequestOption) (*http.Response, error) {
+	req, err := c.NewRequest("GET", u, nil, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1380,7 +1496,7 @@ func (c *Client) roundTripWithOptionalFollowRedirect(ctx context.Context, u stri
 	if followRedirects && resp.StatusCode == http.StatusMovedPermanently {
 		resp.Body.Close()
 		u = resp.Header.Get("Location")
-		resp, err = c.roundTripWithOptionalFollowRedirect(ctx, u, false)
+		resp, err = c.roundTripWithOptionalFollowRedirect(ctx, u, false, opts...)
 	}
 	return resp, err
 }
diff --git a/github/github_test.go b/github/github_test.go
index c4ceb89..9c40728 100644
--- a/github/github_test.go
+++ b/github/github_test.go
@@ -22,6 +22,7 @@ import (
 	"time"
 
 	"github.com/google/go-cmp/cmp"
+	"golang.org/x/oauth2"
 )
 
 const (
@@ -168,6 +169,33 @@ func testJSONMarshal(t *testing.T, v interface{}, want string) {
 	}
 }
 
+// Test whether the v fields have the url tag and the parsing of v
+// produces query parameters that corresponds to the want string.
+func testAddURLOptions(t *testing.T, url string, v interface{}, want string) {
+	t.Helper()
+
+	vt := reflect.Indirect(reflect.ValueOf(v)).Type()
+	for i := 0; i < vt.NumField(); i++ {
+		field := vt.Field(i)
+		if alias, ok := field.Tag.Lookup("url"); ok {
+			if alias == "" {
+				t.Errorf("The field %+v has a blank url tag", field)
+			}
+		} else {
+			t.Errorf("The field %+v has no url tag specified", field)
+		}
+	}
+
+	got, err := addOptions(url, v)
+	if err != nil {
+		t.Errorf("Unable to add %#v as query parameters", v)
+	}
+
+	if got != want {
+		t.Errorf("addOptions(%q, %#v) returned %v, want %v", url, v, got, want)
+	}
+}
+
 // Test how bad options are handled. Method f under test should
 // return an error.
 func testBadOptions(t *testing.T, methodName string, f func() error) {
@@ -184,6 +212,11 @@ func testBadOptions(t *testing.T, methodName string, f func() error) {
 // Method f should be a regular call that would normally succeed, but
 // should return an error when NewRequest or s.client.Do fails.
 func testNewRequestAndDoFailure(t *testing.T, methodName string, client *Client, f func() (*Response, error)) {
+	testNewRequestAndDoFailureCategory(t, methodName, client, coreCategory, f)
+}
+
+// testNewRequestAndDoFailureCategory works Like testNewRequestAndDoFailure, but allows setting the category
+func testNewRequestAndDoFailureCategory(t *testing.T, methodName string, client *Client, category rateLimitCategory, f func() (*Response, error)) {
 	t.Helper()
 	if methodName == "" {
 		t.Error("testNewRequestAndDoFailure: must supply method methodName")
@@ -199,7 +232,7 @@ func testNewRequestAndDoFailure(t *testing.T, methodName string, client *Client,
 	}
 
 	client.BaseURL.Path = "/api-v3/"
-	client.rateLimits[0].Reset.Time = time.Now().Add(10 * time.Minute)
+	client.rateLimits[category].Reset.Time = time.Now().Add(10 * time.Minute)
 	resp, err = f()
 	if bypass := resp.Request.Context().Value(bypassRateLimitCheck); bypass != nil {
 		return
@@ -258,6 +291,13 @@ func TestNewClient(t *testing.T) {
 	}
 }
 
+func TestNewClientWithEnvProxy(t *testing.T) {
+	client := NewClientWithEnvProxy()
+	if got, want := client.BaseURL.String(), defaultBaseURL; got != want {
+		t.Errorf("NewClient BaseURL is %v, want %v", got, want)
+	}
+}
+
 func TestClient(t *testing.T) {
 	c := NewClient(nil)
 	c2 := c.Client()
@@ -266,6 +306,19 @@ func TestClient(t *testing.T) {
 	}
 }
 
+func TestNewTokenClient(t *testing.T) {
+	token := "gh_test_token"
+	ctx := context.Background()
+	c := NewTokenClient(ctx, token)
+	tr, ok := c.Client().Transport.(*oauth2.Transport)
+	if !ok {
+		t.Error("Client transport is not oauth2.Transport")
+	}
+	if tok, err := tr.Source.Token(); err != nil || tok.AccessToken != token {
+		t.Errorf("Client not using correct token")
+	}
+}
+
 func TestNewEnterpriseClient(t *testing.T) {
 	baseURL := "https://custom-url/api/v3/"
 	uploadURL := "https://custom-upload-url/api/uploads/"
@@ -517,6 +570,17 @@ func TestNewRequest(t *testing.T) {
 	if !strings.Contains(userAgent, Version) {
 		t.Errorf("NewRequest() User-Agent should contain %v, found %v", Version, userAgent)
 	}
+
+	apiVersion := req.Header.Get(headerAPIVersion)
+	if got, want := apiVersion, defaultAPIVersion; got != want {
+		t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want)
+	}
+
+	req, _ = c.NewRequest("GET", inURL, inBody, WithVersion("2022-11-29"))
+	apiVersion = req.Header.Get(headerAPIVersion)
+	if got, want := apiVersion, "2022-11-29"; got != want {
+		t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want)
+	}
 }
 
 func TestNewRequest_invalidJSON(t *testing.T) {
@@ -626,6 +690,17 @@ func TestNewFormRequest(t *testing.T) {
 	if got, want := req.Header.Get("User-Agent"), c.UserAgent; got != want {
 		t.Errorf("NewFormRequest() User-Agent is %v, want %v", got, want)
 	}
+
+	apiVersion := req.Header.Get(headerAPIVersion)
+	if got, want := apiVersion, defaultAPIVersion; got != want {
+		t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want)
+	}
+
+	req, _ = c.NewFormRequest(inURL, inBody, WithVersion("2022-11-29"))
+	apiVersion = req.Header.Get(headerAPIVersion)
+	if got, want := apiVersion, "2022-11-29"; got != want {
+		t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want)
+	}
 }
 
 func TestNewFormRequest_badURL(t *testing.T) {
@@ -680,6 +755,22 @@ func TestNewFormRequest_errorForNoTrailingSlash(t *testing.T) {
 	}
 }
 
+func TestNewUploadRequest_WithVersion(t *testing.T) {
+	c := NewClient(nil)
+	req, _ := c.NewUploadRequest("https://example.com/", nil, 0, "")
+
+	apiVersion := req.Header.Get(headerAPIVersion)
+	if got, want := apiVersion, defaultAPIVersion; got != want {
+		t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want)
+	}
+
+	req, _ = c.NewUploadRequest("https://example.com/", nil, 0, "", WithVersion("2022-11-29"))
+	apiVersion = req.Header.Get(headerAPIVersion)
+	if got, want := apiVersion, "2022-11-29"; got != want {
+		t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want)
+	}
+}
+
 func TestNewUploadRequest_badURL(t *testing.T) {
 	c := NewClient(nil)
 	_, err := c.NewUploadRequest(":", nil, 0, "")
@@ -1084,6 +1175,67 @@ func TestDo_rateLimit(t *testing.T) {
 	}
 }
 
+func TestDo_rateLimitCategory(t *testing.T) {
+	tests := []struct {
+		method   string
+		url      string
+		category rateLimitCategory
+	}{
+		{
+			method:   http.MethodGet,
+			url:      "/",
+			category: coreCategory,
+		},
+		{
+			method:   http.MethodGet,
+			url:      "/search/issues?q=rate",
+			category: searchCategory,
+		},
+		{
+			method:   http.MethodGet,
+			url:      "/graphql",
+			category: graphqlCategory,
+		},
+		{
+			method:   http.MethodPost,
+			url:      "/app-manifests/code/conversions",
+			category: integrationManifestCategory,
+		},
+		{
+			method:   http.MethodGet,
+			url:      "/app-manifests/code/conversions",
+			category: coreCategory, // only POST requests are in the integration manifest category
+		},
+		{
+			method:   http.MethodPut,
+			url:      "/repos/google/go-github/import",
+			category: sourceImportCategory,
+		},
+		{
+			method:   http.MethodGet,
+			url:      "/repos/google/go-github/import",
+			category: coreCategory, // only PUT requests are in the source import category
+		},
+		{
+			method:   http.MethodPost,
+			url:      "/repos/google/go-github/code-scanning/sarifs",
+			category: codeScanningUploadCategory,
+		},
+		{
+			method:   http.MethodGet,
+			url:      "/scim/v2/organizations/ORG/Users",
+			category: scimCategory,
+		},
+		// missing a check for actionsRunnerRegistrationCategory: API not found
+	}
+
+	for _, tt := range tests {
+		if got, want := category(tt.method, tt.url), tt.category; got != want {
+			t.Errorf("expecting category %v, found %v", got, want)
+		}
+	}
+}
+
 // ensure rate limit is still parsed, even for error responses
 func TestDo_rateLimit_errorResponse(t *testing.T) {
 	client, mux, _, teardown := setup()
@@ -1355,6 +1507,25 @@ func TestDo_rateLimit_abuseRateLimitError_retryAfter(t *testing.T) {
 	if got, want := *abuseRateLimitErr.RetryAfter, 123*time.Second; got != want {
 		t.Errorf("abuseRateLimitErr RetryAfter = %v, want %v", got, want)
 	}
+
+	// expect prevention of a following request
+	if _, err = client.Do(ctx, req, nil); err == nil {
+		t.Error("Expected error to be returned.")
+	}
+	abuseRateLimitErr, ok = err.(*AbuseRateLimitError)
+	if !ok {
+		t.Fatalf("Expected a *AbuseRateLimitError error; got %#v.", err)
+	}
+	if abuseRateLimitErr.RetryAfter == nil {
+		t.Fatalf("abuseRateLimitErr RetryAfter is nil, expected not-nil")
+	}
+	// the saved duration might be a bit smaller than Retry-After because the duration is calculated from the expected end-of-cooldown time
+	if got, want := *abuseRateLimitErr.RetryAfter, 123*time.Second; want-got > 1*time.Second {
+		t.Errorf("abuseRateLimitErr RetryAfter = %v, want %v", got, want)
+	}
+	if got, wantSuffix := abuseRateLimitErr.Message, "not making remote request."; !strings.HasSuffix(got, wantSuffix) {
+		t.Errorf("Expected request to be prevented because of secondary rate limit, got: %v.", got)
+	}
 }
 
 func TestDo_noContent(t *testing.T) {
@@ -2013,30 +2184,48 @@ func TestRateLimits(t *testing.T) {
 	if !cmp.Equal(rate, want) {
 		t.Errorf("RateLimits returned %+v, want %+v", rate, want)
 	}
-
-	if got, want := client.rateLimits[coreCategory], *want.Core; got != want {
-		t.Errorf("client.rateLimits[coreCategory] is %+v, want %+v", got, want)
-	}
-	if got, want := client.rateLimits[searchCategory], *want.Search; got != want {
-		t.Errorf("client.rateLimits[searchCategory] is %+v, want %+v", got, want)
-	}
-	if got, want := client.rateLimits[graphqlCategory], *want.GraphQL; got != want {
-		t.Errorf("client.rateLimits[graphqlCategory] is %+v, want %+v", got, want)
-	}
-	if got, want := client.rateLimits[integrationManifestCategory], *want.IntegrationManifest; got != want {
-		t.Errorf("client.rateLimits[integrationManifestCategory] is %+v, want %+v", got, want)
-	}
-	if got, want := client.rateLimits[sourceImportCategory], *want.SourceImport; got != want {
-		t.Errorf("client.rateLimits[sourceImportCategory] is %+v, want %+v", got, want)
-	}
-	if got, want := client.rateLimits[codeScanningUploadCategory], *want.CodeScanningUpload; got != want {
-		t.Errorf("client.rateLimits[codeScanningUploadCategory] is %+v, want %+v", got, want)
-	}
-	if got, want := client.rateLimits[actionsRunnerRegistrationCategory], *want.ActionsRunnerRegistration; got != want {
-		t.Errorf("client.rateLimits[actionsRunnerRegistrationCategory] is %+v, want %+v", got, want)
+	tests := []struct {
+		category rateLimitCategory
+		rate     *Rate
+	}{
+		{
+			category: coreCategory,
+			rate:     want.Core,
+		},
+		{
+			category: searchCategory,
+			rate:     want.Search,
+		},
+		{
+			category: graphqlCategory,
+			rate:     want.GraphQL,
+		},
+		{
+			category: integrationManifestCategory,
+			rate:     want.IntegrationManifest,
+		},
+		{
+			category: sourceImportCategory,
+			rate:     want.SourceImport,
+		},
+		{
+			category: codeScanningUploadCategory,
+			rate:     want.CodeScanningUpload,
+		},
+		{
+			category: actionsRunnerRegistrationCategory,
+			rate:     want.ActionsRunnerRegistration,
+		},
+		{
+			category: scimCategory,
+			rate:     want.SCIM,
+		},
 	}
-	if got, want := client.rateLimits[scimCategory], *want.SCIM; got != want {
-		t.Errorf("client.rateLimits[scimCategory] is %+v, want %+v", got, want)
+
+	for _, tt := range tests {
+		if got, want := client.rateLimits[tt.category], *tt.rate; got != want {
+			t.Errorf("client.rateLimits[%v] is %+v, want %+v", tt.category, got, want)
+		}
 	}
 }
 
@@ -2065,7 +2254,13 @@ func TestRateLimits_overQuota(t *testing.T) {
 	mux.HandleFunc("/rate_limit", func(w http.ResponseWriter, r *http.Request) {
 		fmt.Fprint(w, `{"resources":{
 			"core": {"limit":2,"remaining":1,"reset":1372700873},
-			"search": {"limit":3,"remaining":2,"reset":1372700874}
+			"search": {"limit":3,"remaining":2,"reset":1372700874},
+			"graphql": {"limit":4,"remaining":3,"reset":1372700875},
+			"integration_manifest": {"limit":5,"remaining":4,"reset":1372700876},
+			"source_import": {"limit":6,"remaining":5,"reset":1372700877},
+			"code_scanning_upload": {"limit":7,"remaining":6,"reset":1372700878},
+			"actions_runner_registration": {"limit":8,"remaining":7,"reset":1372700879},
+			"scim": {"limit":9,"remaining":8,"reset":1372700880}
 		}}`)
 	})
 
@@ -2086,16 +2281,82 @@ func TestRateLimits_overQuota(t *testing.T) {
 			Remaining: 2,
 			Reset:     Timestamp{time.Date(2013, time.July, 1, 17, 47, 54, 0, time.UTC).Local()},
 		},
+		GraphQL: &Rate{
+			Limit:     4,
+			Remaining: 3,
+			Reset:     Timestamp{time.Date(2013, time.July, 1, 17, 47, 55, 0, time.UTC).Local()},
+		},
+		IntegrationManifest: &Rate{
+			Limit:     5,
+			Remaining: 4,
+			Reset:     Timestamp{time.Date(2013, time.July, 1, 17, 47, 56, 0, time.UTC).Local()},
+		},
+		SourceImport: &Rate{
+			Limit:     6,
+			Remaining: 5,
+			Reset:     Timestamp{time.Date(2013, time.July, 1, 17, 47, 57, 0, time.UTC).Local()},
+		},
+		CodeScanningUpload: &Rate{
+			Limit:     7,
+			Remaining: 6,
+			Reset:     Timestamp{time.Date(2013, time.July, 1, 17, 47, 58, 0, time.UTC).Local()},
+		},
+		ActionsRunnerRegistration: &Rate{
+			Limit:     8,
+			Remaining: 7,
+			Reset:     Timestamp{time.Date(2013, time.July, 1, 17, 47, 59, 0, time.UTC).Local()},
+		},
+		SCIM: &Rate{
+			Limit:     9,
+			Remaining: 8,
+			Reset:     Timestamp{time.Date(2013, time.July, 1, 17, 48, 00, 0, time.UTC).Local()},
+		},
 	}
 	if !cmp.Equal(rate, want) {
 		t.Errorf("RateLimits returned %+v, want %+v", rate, want)
 	}
 
-	if got, want := client.rateLimits[coreCategory], *want.Core; got != want {
-		t.Errorf("client.rateLimits[coreCategory] is %+v, want %+v", got, want)
+	tests := []struct {
+		category rateLimitCategory
+		rate     *Rate
+	}{
+		{
+			category: coreCategory,
+			rate:     want.Core,
+		},
+		{
+			category: searchCategory,
+			rate:     want.Search,
+		},
+		{
+			category: graphqlCategory,
+			rate:     want.GraphQL,
+		},
+		{
+			category: integrationManifestCategory,
+			rate:     want.IntegrationManifest,
+		},
+		{
+			category: sourceImportCategory,
+			rate:     want.SourceImport,
+		},
+		{
+			category: codeScanningUploadCategory,
+			rate:     want.CodeScanningUpload,
+		},
+		{
+			category: actionsRunnerRegistrationCategory,
+			rate:     want.ActionsRunnerRegistration,
+		},
+		{
+			category: scimCategory,
+			rate:     want.SCIM,
+		},
 	}
-	if got, want := client.rateLimits[searchCategory], *want.Search; got != want {
-		t.Errorf("client.rateLimits[searchCategory] is %+v, want %+v", got, want)
+	for _, tt := range tests {
+		if got, want := client.rateLimits[tt.category], *tt.rate; got != want {
+			t.Errorf("client.rateLimits[%v] is %+v, want %+v", tt.category, got, want)
+		}
 	}
 }
 
@@ -2633,6 +2894,16 @@ func TestParseTokenExpiration(t *testing.T) {
 			header: "2021-09-03 02:34:04 UTC",
 			want:   Timestamp{time.Date(2021, time.September, 3, 2, 34, 4, 0, time.UTC)},
 		},
+		{
+			header: "2021-09-03 14:34:04 UTC",
+			want:   Timestamp{time.Date(2021, time.September, 3, 14, 34, 4, 0, time.UTC)},
+		},
+		// Some tokens include the timezone offset instead of the timezone.
+		// https://github.com/google/go-github/issues/2649
+		{
+			header: "2023-04-26 20:23:26 +0200",
+			want:   Timestamp{time.Date(2023, time.April, 26, 18, 23, 26, 0, time.UTC)},
+		},
 	}
 
 	for _, tt := range tests {
@@ -2644,7 +2915,7 @@ func TestParseTokenExpiration(t *testing.T) {
 		res.Header.Set(headerTokenExpiration, tt.header)
 		exp := parseTokenExpiration(res)
 		if !exp.Equal(tt.want) {
-			t.Errorf("parseTokenExpiration returned %#v, want %#v", exp, tt.want)
+			t.Errorf("parseTokenExpiration of %q\nreturned %#v\n    want %#v", tt.header, exp, tt.want)
 		}
 	}
 }
diff --git a/github/issue_import.go b/github/issue_import.go
index a981040..4bc8d5f 100644
--- a/github/issue_import.go
+++ b/github/issue_import.go
@@ -10,7 +10,6 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"time"
 )
 
 // IssueImportService handles communication with the issue import related
@@ -29,9 +28,9 @@ type IssueImportRequest struct {
 type IssueImport struct {
 	Title     string     `json:"title"`
 	Body      string     `json:"body"`
-	CreatedAt *time.Time `json:"created_at,omitempty"`
-	ClosedAt  *time.Time `json:"closed_at,omitempty"`
-	UpdatedAt *time.Time `json:"updated_at,omitempty"`
+	CreatedAt *Timestamp `json:"created_at,omitempty"`
+	ClosedAt  *Timestamp `json:"closed_at,omitempty"`
+	UpdatedAt *Timestamp `json:"updated_at,omitempty"`
 	Assignee  *string    `json:"assignee,omitempty"`
 	Milestone *int       `json:"milestone,omitempty"`
 	Closed    *bool      `json:"closed,omitempty"`
@@ -40,7 +39,7 @@ type IssueImport struct {
 
 // Comment represents comments of issue to import.
 type Comment struct {
-	CreatedAt *time.Time `json:"created_at,omitempty"`
+	CreatedAt *Timestamp `json:"created_at,omitempty"`
 	Body      string     `json:"body"`
 }
 
@@ -53,8 +52,8 @@ type IssueImportResponse struct {
 	URL              *string             `json:"url,omitempty"`
 	ImportIssuesURL  *string             `json:"import_issues_url,omitempty"`
 	RepositoryURL    *string             `json:"repository_url,omitempty"`
-	CreatedAt        *time.Time          `json:"created_at,omitempty"`
-	UpdatedAt        *time.Time          `json:"updated_at,omitempty"`
+	CreatedAt        *Timestamp          `json:"created_at,omitempty"`
+	UpdatedAt        *Timestamp          `json:"updated_at,omitempty"`
 	Message          *string             `json:"message,omitempty"`
 	DocumentationURL *string             `json:"documentation_url,omitempty"`
 	Errors           []*IssueImportError `json:"errors,omitempty"`
@@ -126,7 +125,7 @@ func (s *IssueImportService) CheckStatus(ctx context.Context, owner, repo string
 // CheckStatusSince checks the status of multiple imported issues since a given date.
 //
 // https://gist.github.com/jonmagic/5282384165e0f86ef105#check-status-of-multiple-issues
-func (s *IssueImportService) CheckStatusSince(ctx context.Context, owner, repo string, since time.Time) ([]*IssueImportResponse, *Response, error) {
+func (s *IssueImportService) CheckStatusSince(ctx context.Context, owner, repo string, since Timestamp) ([]*IssueImportResponse, *Response, error) {
 	u := fmt.Sprintf("repos/%v/%v/import/issues?since=%v", owner, repo, since.Format("2006-01-02"))
 	req, err := s.client.NewRequest("GET", u, nil)
 	if err != nil {
diff --git a/github/issue_import_test.go b/github/issue_import_test.go
index 3533b3a..a86ead8 100644
--- a/github/issue_import_test.go
+++ b/github/issue_import_test.go
@@ -25,13 +25,13 @@ func TestIssueImportService_Create(t *testing.T) {
 		IssueImport: IssueImport{
 			Assignee:  String("developer"),
 			Body:      "Dummy description",
-			CreatedAt: &createdAt,
+			CreatedAt: &Timestamp{createdAt},
 			Labels:    []string{"l1", "l2"},
 			Milestone: Int(1),
 			Title:     "Dummy Issue",
 		},
 		Comments: []*Comment{{
-			CreatedAt: &createdAt,
+			CreatedAt: &Timestamp{createdAt},
 			Body:      "Comment body",
 		}},
 	}
@@ -142,7 +142,7 @@ func TestIssueImportService_CheckStatusSince(t *testing.T) {
 	})
 
 	ctx := context.Background()
-	got, _, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", time.Now())
+	got, _, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", Timestamp{time.Now()})
 	if err != nil {
 		t.Errorf("CheckStatusSince returned error: %v", err)
 	}
@@ -154,12 +154,12 @@ func TestIssueImportService_CheckStatusSince(t *testing.T) {
 
 	const methodName = "CheckStatusSince"
 	testBadOptions(t, methodName, func() (err error) {
-		_, _, err = client.IssueImport.CheckStatusSince(ctx, "\n", "\n", time.Now())
+		_, _, err = client.IssueImport.CheckStatusSince(ctx, "\n", "\n", Timestamp{time.Now()})
 		return err
 	})
 
 	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
-		got, resp, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", time.Now())
+		got, resp, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", Timestamp{time.Now()})
 		if got != nil {
 			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
 		}
@@ -179,7 +179,7 @@ func TestIssueImportService_CheckStatusSince_badResponse(t *testing.T) {
 	})
 
 	ctx := context.Background()
-	if _, _, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", time.Now()); err == nil {
+	if _, _, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", Timestamp{time.Now()}); err == nil {
 		t.Errorf("CheckStatusSince returned no error, want JSON err")
 	}
 }
@@ -189,7 +189,7 @@ func TestIssueImportService_CheckStatusSince_invalidOwner(t *testing.T) {
 	defer teardown()
 
 	ctx := context.Background()
-	_, _, err := client.IssueImport.CheckStatusSince(ctx, "%", "r", time.Now())
+	_, _, err := client.IssueImport.CheckStatusSince(ctx, "%", "r", Timestamp{time.Now()})
 	testURLParseError(t, err)
 }
 
@@ -240,8 +240,8 @@ func TestIssueImportResponse_Marshal(t *testing.T) {
 		URL:              String("url"),
 		ImportIssuesURL:  String("iiu"),
 		RepositoryURL:    String("ru"),
-		CreatedAt:        &referenceTime,
-		UpdatedAt:        &referenceTime,
+		CreatedAt:        &Timestamp{referenceTime},
+		UpdatedAt:        &Timestamp{referenceTime},
 		Message:          String("msg"),
 		DocumentationURL: String("durl"),
 		Errors: []*IssueImportError{
@@ -283,7 +283,7 @@ func TestComment_Marshal(t *testing.T) {
 	testJSONMarshal(t, &Comment{}, "{}")
 
 	u := &Comment{
-		CreatedAt: &referenceTime,
+		CreatedAt: &Timestamp{referenceTime},
 		Body:      "body",
 	}
 
@@ -301,9 +301,9 @@ func TestIssueImport_Marshal(t *testing.T) {
 	u := &IssueImport{
 		Title:     "title",
 		Body:      "body",
-		CreatedAt: &referenceTime,
-		ClosedAt:  &referenceTime,
-		UpdatedAt: &referenceTime,
+		CreatedAt: &Timestamp{referenceTime},
+		ClosedAt:  &Timestamp{referenceTime},
+		UpdatedAt: &Timestamp{referenceTime},
 		Assignee:  String("a"),
 		Milestone: Int(1),
 		Closed:    Bool(false),
@@ -334,9 +334,9 @@ func TestIssueImportRequest_Marshal(t *testing.T) {
 		IssueImport: IssueImport{
 			Title:     "title",
 			Body:      "body",
-			CreatedAt: &referenceTime,
-			ClosedAt:  &referenceTime,
-			UpdatedAt: &referenceTime,
+			CreatedAt: &Timestamp{referenceTime},
+			ClosedAt:  &Timestamp{referenceTime},
+			UpdatedAt: &Timestamp{referenceTime},
 			Assignee:  String("a"),
 			Milestone: Int(1),
 			Closed:    Bool(false),
@@ -344,7 +344,7 @@ func TestIssueImportRequest_Marshal(t *testing.T) {
 		},
 		Comments: []*Comment{
 			{
-				CreatedAt: &referenceTime,
+				CreatedAt: &Timestamp{referenceTime},
 				Body:      "body",
 			},
 		},
diff --git a/github/issues.go b/github/issues.go
index 351ec09..42e58a1 100644
--- a/github/issues.go
+++ b/github/issues.go
@@ -25,9 +25,11 @@ type IssuesService service
 // this is an issue, and if PullRequestLinks is not nil, this is a pull request.
 // The IsPullRequest helper method can be used to check that.
 type Issue struct {
-	ID                *int64            `json:"id,omitempty"`
-	Number            *int              `json:"number,omitempty"`
-	State             *string           `json:"state,omitempty"`
+	ID     *int64  `json:"id,omitempty"`
+	Number *int    `json:"number,omitempty"`
+	State  *string `json:"state,omitempty"`
+	// StateReason can be one of: "completed", "not_planned", "reopened".
+	StateReason       *string           `json:"state_reason,omitempty"`
 	Locked            *bool             `json:"locked,omitempty"`
 	Title             *string           `json:"title,omitempty"`
 	Body              *string           `json:"body,omitempty"`
@@ -36,9 +38,9 @@ type Issue struct {
 	Labels            []*Label          `json:"labels,omitempty"`
 	Assignee          *User             `json:"assignee,omitempty"`
 	Comments          *int              `json:"comments,omitempty"`
-	ClosedAt          *time.Time        `json:"closed_at,omitempty"`
-	CreatedAt         *time.Time        `json:"created_at,omitempty"`
-	UpdatedAt         *time.Time        `json:"updated_at,omitempty"`
+	ClosedAt          *Timestamp        `json:"closed_at,omitempty"`
+	CreatedAt         *Timestamp        `json:"created_at,omitempty"`
+	UpdatedAt         *Timestamp        `json:"updated_at,omitempty"`
 	ClosedBy          *User             `json:"closed_by,omitempty"`
 	URL               *string           `json:"url,omitempty"`
 	HTMLURL           *string           `json:"html_url,omitempty"`
diff --git a/github/issues_comments.go b/github/issues_comments.go
index 361ee49..17881c0 100644
--- a/github/issues_comments.go
+++ b/github/issues_comments.go
@@ -18,8 +18,8 @@ type IssueComment struct {
 	Body      *string    `json:"body,omitempty"`
 	User      *User      `json:"user,omitempty"`
 	Reactions *Reactions `json:"reactions,omitempty"`
-	CreatedAt *time.Time `json:"created_at,omitempty"`
-	UpdatedAt *time.Time `json:"updated_at,omitempty"`
+	CreatedAt *Timestamp `json:"created_at,omitempty"`
+	UpdatedAt *Timestamp `json:"updated_at,omitempty"`
 	// AuthorAssociation is the comment author's relationship to the issue's repository.
 	// Possible values are "COLLABORATOR", "CONTRIBUTOR", "FIRST_TIMER", "FIRST_TIME_CONTRIBUTOR", "MEMBER", "OWNER", or "NONE".
 	AuthorAssociation *string `json:"author_association,omitempty"`
diff --git a/github/issues_comments_test.go b/github/issues_comments_test.go
index 7780676..d35deed 100644
--- a/github/issues_comments_test.go
+++ b/github/issues_comments_test.go
@@ -323,8 +323,8 @@ func TestIssueComment_Marshal(t *testing.T) {
 			SuspendedAt:     &Timestamp{referenceTime},
 		},
 		Reactions:         &Reactions{TotalCount: Int(1)},
-		CreatedAt:         &referenceTime,
-		UpdatedAt:         &referenceTime,
+		CreatedAt:         &Timestamp{referenceTime},
+		UpdatedAt:         &Timestamp{referenceTime},
 		AuthorAssociation: String("aa"),
 		URL:               String("url"),
 		HTMLURL:           String("hurl"),
diff --git a/github/issues_events.go b/github/issues_events.go
index d8ffc0b..ed07659 100644
--- a/github/issues_events.go
+++ b/github/issues_events.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // IssueEvent represents an event that occurred around an Issue or Pull Request.
@@ -71,7 +70,7 @@ type IssueEvent struct {
 	//
 	Event *string `json:"event,omitempty"`
 
-	CreatedAt *time.Time `json:"created_at,omitempty"`
+	CreatedAt *Timestamp `json:"created_at,omitempty"`
 	Issue     *Issue     `json:"issue,omitempty"`
 
 	// Only present on certain events; see above.
diff --git a/github/issues_events_test.go b/github/issues_events_test.go
index ba21565..1d8d323 100644
--- a/github/issues_events_test.go
+++ b/github/issues_events_test.go
@@ -193,7 +193,7 @@ func TestIssueEvent_Marshal(t *testing.T) {
 			SuspendedAt:     &Timestamp{referenceTime},
 		},
 		Event:     String("event"),
-		CreatedAt: &referenceTime,
+		CreatedAt: &Timestamp{referenceTime},
 		Issue:     &Issue{ID: Int64(1)},
 		Assignee: &User{
 			Login:           String("l"),
diff --git a/github/issues_milestones.go b/github/issues_milestones.go
index 3c9be24..897c7c0 100644
--- a/github/issues_milestones.go
+++ b/github/issues_milestones.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // Milestone represents a GitHub repository milestone.
@@ -24,10 +23,10 @@ type Milestone struct {
 	Creator      *User      `json:"creator,omitempty"`
 	OpenIssues   *int       `json:"open_issues,omitempty"`
 	ClosedIssues *int       `json:"closed_issues,omitempty"`
-	CreatedAt    *time.Time `json:"created_at,omitempty"`
-	UpdatedAt    *time.Time `json:"updated_at,omitempty"`
-	ClosedAt     *time.Time `json:"closed_at,omitempty"`
-	DueOn        *time.Time `json:"due_on,omitempty"`
+	CreatedAt    *Timestamp `json:"created_at,omitempty"`
+	UpdatedAt    *Timestamp `json:"updated_at,omitempty"`
+	ClosedAt     *Timestamp `json:"closed_at,omitempty"`
+	DueOn        *Timestamp `json:"due_on,omitempty"`
 	NodeID       *string    `json:"node_id,omitempty"`
 }
 
diff --git a/github/issues_milestones_test.go b/github/issues_milestones_test.go
index 86d1bdd..b6472f3 100644
--- a/github/issues_milestones_test.go
+++ b/github/issues_milestones_test.go
@@ -284,10 +284,10 @@ func TestMilestone_Marshal(t *testing.T) {
 		},
 		OpenIssues:   Int(1),
 		ClosedIssues: Int(1),
-		CreatedAt:    &referenceTime,
-		UpdatedAt:    &referenceTime,
-		ClosedAt:     &referenceTime,
-		DueOn:        &referenceTime,
+		CreatedAt:    &Timestamp{referenceTime},
+		UpdatedAt:    &Timestamp{referenceTime},
+		ClosedAt:     &Timestamp{referenceTime},
+		DueOn:        &Timestamp{referenceTime},
 		NodeID:       String("nid"),
 	}
 
diff --git a/github/issues_test.go b/github/issues_test.go
index e2cf063..37b2c2a 100644
--- a/github/issues_test.go
+++ b/github/issues_test.go
@@ -556,9 +556,9 @@ func TestIssue_Marshal(t *testing.T) {
 		Labels:            []*Label{{ID: Int64(1)}},
 		Assignee:          &User{ID: Int64(1)},
 		Comments:          Int(1),
-		ClosedAt:          &referenceTime,
-		CreatedAt:         &referenceTime,
-		UpdatedAt:         &referenceTime,
+		ClosedAt:          &Timestamp{referenceTime},
+		CreatedAt:         &Timestamp{referenceTime},
+		UpdatedAt:         &Timestamp{referenceTime},
 		ClosedBy:          &User{ID: Int64(1)},
 		URL:               String("url"),
 		HTMLURL:           String("hurl"),
diff --git a/github/issues_timeline.go b/github/issues_timeline.go
index 9ec498e..9c73e61 100644
--- a/github/issues_timeline.go
+++ b/github/issues_timeline.go
@@ -9,7 +9,6 @@ import (
 	"context"
 	"fmt"
 	"strings"
-	"time"
 )
 
 // Timeline represents an event that occurred around an Issue or Pull Request.
@@ -35,6 +34,8 @@ type Timeline struct {
 	SHA *string `json:"sha,omitempty"`
 	// The commit message.
 	Message *string `json:"message,omitempty"`
+	// A list of parent commits.
+	Parents []*Commit `json:"parents,omitempty"`
 
 	// Event identifies the actual type of Event that occurred. Possible values
 	// are:
@@ -116,7 +117,7 @@ type Timeline struct {
 	// The string SHA of a commit that referenced this Issue or Pull Request.
 	CommitID *string `json:"commit_id,omitempty"`
 	// The timestamp indicating when the event occurred.
-	CreatedAt *time.Time `json:"created_at,omitempty"`
+	CreatedAt *Timestamp `json:"created_at,omitempty"`
 	// The Label object including `name` and `color` attributes. Only provided for
 	// 'labeled' and 'unlabeled' events.
 	Label *Label `json:"label,omitempty"`
@@ -142,12 +143,14 @@ type Timeline struct {
 
 	// The person requested to review the pull request.
 	Reviewer *User `json:"requested_reviewer,omitempty"`
+	// RequestedTeam contains the team requested to review the pull request.
+	RequestedTeam *Team `json:"requested_team,omitempty"`
 	// The person who requested a review.
 	Requester *User `json:"review_requester,omitempty"`
 
 	// The review summary text.
 	Body        *string    `json:"body,omitempty"`
-	SubmittedAt *time.Time `json:"submitted_at,omitempty"`
+	SubmittedAt *Timestamp `json:"submitted_at,omitempty"`
 }
 
 // Source represents a reference's source.
diff --git a/github/issues_timeline_test.go b/github/issues_timeline_test.go
index 17ae618..27c7c11 100644
--- a/github/issues_timeline_test.go
+++ b/github/issues_timeline_test.go
@@ -126,7 +126,7 @@ func TestTimeline_Marshal(t *testing.T) {
 		},
 		Event:     String("event"),
 		CommitID:  String("cid"),
-		CreatedAt: &referenceTime,
+		CreatedAt: &Timestamp{referenceTime},
 		Label:     &Label{ID: Int64(1)},
 		Assignee: &User{
 			Login:           String("l"),
diff --git a/github/messages.go b/github/messages.go
index ceac6d9..925e73e 100644
--- a/github/messages.go
+++ b/github/messages.go
@@ -56,6 +56,7 @@ var (
 		"deployment":                     "DeploymentEvent",
 		"deployment_status":              "DeploymentStatusEvent",
 		"discussion":                     "DiscussionEvent",
+		"discussion_comment":             "DiscussionCommentEvent",
 		"fork":                           "ForkEvent",
 		"github_app_authorization":       "GitHubAppAuthorizationEvent",
 		"gollum":                         "GollumEvent",
@@ -147,13 +148,13 @@ func messageMAC(signature string) ([]byte, func() hash.Hash, error) {
 	return buf, hashFunc, nil
 }
 
-// ValidatePayload validates an incoming GitHub Webhook event request body
+// ValidatePayloadFromBody validates an incoming GitHub Webhook event request body
 // and returns the (JSON) payload.
 // The Content-Type header of the payload can be "application/json" or "application/x-www-form-urlencoded".
 // If the Content-Type is neither then an error is returned.
 // secretToken is the GitHub Webhook secret token.
-// If your webhook does not contain a secret token, you can pass nil or an empty slice.
-// This is intended for local development purposes only and all webhooks should ideally set up a secret token.
+// If your webhook does not contain a secret token, you can pass an empty secretToken.
+// Webhooks without a secret token are not secure and should be avoided.
 //
 // Example usage:
 //
@@ -200,9 +201,8 @@ func ValidatePayloadFromBody(contentType string, readable io.Reader, signature s
 		return nil, fmt.Errorf("webhook request has unsupported Content-Type %q", contentType)
 	}
 
-	// Only validate the signature if a secret token exists. This is intended for
-	// local development only and all webhooks should ideally set up a secret token.
-	if len(secretToken) > 0 {
+	// Validate the signature if present or if one is expected (secretToken is non-empty).
+	if len(secretToken) > 0 || len(signature) > 0 {
 		if err := ValidateSignature(signature, body, secretToken); err != nil {
 			return nil, err
 		}
diff --git a/github/messages_test.go b/github/messages_test.go
index 9819ddb..04f2942 100644
--- a/github/messages_test.go
+++ b/github/messages_test.go
@@ -30,51 +30,42 @@ func TestValidatePayload(t *testing.T) {
 	const defaultSignature = "sha1=126f2c800419c60137ce748d7672e77b65cf16d6"
 	secretKey := []byte("0123456789abcdef")
 	tests := []struct {
+		secretKey       []byte
 		signature       string
 		signatureHeader string
-		eventID         string
-		event           string
-		wantEventID     string
-		wantEvent       string
 		wantPayload     string
 	}{
 		// The following tests generate expected errors:
-		{},                         // Missing signature
-		{signature: "yo"},          // Missing signature prefix
-		{signature: "sha1=yo"},     // Signature not hex string
-		{signature: "sha1=012345"}, // Invalid signature
+		{secretKey: secretKey},                           // Missing signature
+		{secretKey: secretKey, signature: "yo"},          // Missing signature prefix
+		{secretKey: secretKey, signature: "sha1=yo"},     // Signature not hex string
+		{secretKey: secretKey, signature: "sha1=012345"}, // Invalid signature
+		{signature: defaultSignature},                    // signature without secretKey
+
 		// The following tests expect err=nil:
 		{
-			signature:   defaultSignature,
-			eventID:     "dead-beef",
-			event:       "ping",
-			wantEventID: "dead-beef",
-			wantEvent:   "ping",
+			// no secretKey and no signature still passes validation
 			wantPayload: defaultBody,
 		},
 		{
+			secretKey:   secretKey,
 			signature:   defaultSignature,
-			event:       "ping",
-			wantEvent:   "ping",
 			wantPayload: defaultBody,
 		},
 		{
+			secretKey:   secretKey,
 			signature:   "sha256=b1f8020f5b4cd42042f807dd939015c4a418bc1ff7f604dd55b0a19b5d953d9b",
-			event:       "ping",
-			wantEvent:   "ping",
 			wantPayload: defaultBody,
 		},
 		{
+			secretKey:       secretKey,
 			signature:       "sha256=b1f8020f5b4cd42042f807dd939015c4a418bc1ff7f604dd55b0a19b5d953d9b",
 			signatureHeader: SHA256SignatureHeader,
-			event:           "ping",
-			wantEvent:       "ping",
 			wantPayload:     defaultBody,
 		},
 		{
+			secretKey:   secretKey,
 			signature:   "sha512=8456767023c1195682e182a23b3f5d19150ecea598fde8cb85918f7281b16079471b1329f92b912c4d8bd7455cb159777db8f29608b20c7c87323ba65ae62e1f",
-			event:       "ping",
-			wantEvent:   "ping",
 			wantPayload: defaultBody,
 		},
 	}
@@ -94,7 +85,7 @@ func TestValidatePayload(t *testing.T) {
 		}
 		req.Header.Set("Content-Type", "application/json")
 
-		got, err := ValidatePayload(req, secretKey)
+		got, err := ValidatePayload(req, test.secretKey)
 		if err != nil {
 			if test.wantPayload != "" {
 				t.Errorf("ValidatePayload(%#v): err = %v, want nil", test, err)
@@ -305,6 +296,10 @@ func TestParseWebHook(t *testing.T) {
 			payload:     &DeploymentStatusEvent{},
 			messageType: "deployment_status",
 		},
+		{
+			payload:     &DiscussionCommentEvent{},
+			messageType: "discussion_comment",
+		},
 		{
 			payload:     &DiscussionEvent{},
 			messageType: "discussion",
diff --git a/github/orgs.go b/github/orgs.go
index 8105afa..0c7e361 100644
--- a/github/orgs.go
+++ b/github/orgs.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // OrganizationsService provides access to the organization related functions
@@ -35,10 +34,10 @@ type Organization struct {
 	PublicGists                 *int       `json:"public_gists,omitempty"`
 	Followers                   *int       `json:"followers,omitempty"`
 	Following                   *int       `json:"following,omitempty"`
-	CreatedAt                   *time.Time `json:"created_at,omitempty"`
-	UpdatedAt                   *time.Time `json:"updated_at,omitempty"`
-	TotalPrivateRepos           *int       `json:"total_private_repos,omitempty"`
-	OwnedPrivateRepos           *int       `json:"owned_private_repos,omitempty"`
+	CreatedAt                   *Timestamp `json:"created_at,omitempty"`
+	UpdatedAt                   *Timestamp `json:"updated_at,omitempty"`
+	TotalPrivateRepos           *int64     `json:"total_private_repos,omitempty"`
+	OwnedPrivateRepos           *int64     `json:"owned_private_repos,omitempty"`
 	PrivateGists                *int       `json:"private_gists,omitempty"`
 	DiskUsage                   *int       `json:"disk_usage,omitempty"`
 	Collaborators               *int       `json:"collaborators,omitempty"`
@@ -122,7 +121,7 @@ type Plan struct {
 	Name          *string `json:"name,omitempty"`
 	Space         *int    `json:"space,omitempty"`
 	Collaborators *int    `json:"collaborators,omitempty"`
-	PrivateRepos  *int    `json:"private_repos,omitempty"`
+	PrivateRepos  *int64  `json:"private_repos,omitempty"`
 	FilledSeats   *int    `json:"filled_seats,omitempty"`
 	Seats         *int    `json:"seats,omitempty"`
 }
@@ -263,6 +262,19 @@ func (s *OrganizationsService) Edit(ctx context.Context, name string, org *Organ
 	return o, resp, nil
 }
 
+// Delete an organization by name.
+//
+// GitHub API docs: https://docs.github.com/en/rest/orgs/orgs#delete-an-organization
+func (s *OrganizationsService) Delete(ctx context.Context, org string) (*Response, error) {
+	u := fmt.Sprintf("orgs/%v", org)
+	req, err := s.client.NewRequest("DELETE", u, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
+
 // ListInstallations lists installations for an organization.
 //
 // GitHub API docs: https://docs.github.com/en/rest/orgs/orgs#list-app-installations-for-an-organization
diff --git a/github/orgs_audit_log.go b/github/orgs_audit_log.go
index be5fd24..700c233 100644
--- a/github/orgs_audit_log.go
+++ b/github/orgs_audit_log.go
@@ -63,8 +63,10 @@ type AuditEntry struct {
 	Message               *string     `json:"message,omitempty"`
 	Name                  *string     `json:"name,omitempty"`
 	OldUser               *string     `json:"old_user,omitempty"`
+	OldPermission         *string     `json:"old_permission,omitempty"` // The permission level for membership changes, for example `admin` or `read`.
 	OpenSSHPublicKey      *string     `json:"openssh_public_key,omitempty"`
 	Org                   *string     `json:"org,omitempty"`
+	Permission            *string     `json:"permission,omitempty"` // The permission level for membership changes, for example `admin` or `read`.
 	PreviousVisibility    *string     `json:"previous_visibility,omitempty"`
 	ReadOnly              *string     `json:"read_only,omitempty"`
 	Repo                  *string     `json:"repo,omitempty"`
diff --git a/github/orgs_audit_log_test.go b/github/orgs_audit_log_test.go
index 1f06007..be63615 100644
--- a/github/orgs_audit_log_test.go
+++ b/github/orgs_audit_log_test.go
@@ -34,6 +34,8 @@ func TestOrganizationService_GetAuditLog(t *testing.T) {
         "created_at": 1615077308538,
         "head_sha": "5acdeadbeef64d1a62388e901e5cdc9358644b37",
         "conclusion": "success",
+        "old_permission": "read",
+        "permission": "admin",
         "actor": "testactor",
         "completed_at": "2021-03-07T00:35:08.000Z",
         "@timestamp": 1615077308538,
@@ -80,7 +82,9 @@ func TestOrganizationService_GetAuditLog(t *testing.T) {
 			HeadBranch:    String("master"),
 			HeadSHA:       String("5acdeadbeef64d1a62388e901e5cdc9358644b37"),
 			Name:          String("Code scanning - action"),
+			OldPermission: String("read"),
 			Org:           String("o"),
+			Permission:    String("admin"),
 			Repo:          String("o/blue-crayon-1"),
 			StartedAt:     &Timestamp{startedAt},
 			WorkflowID:    Int64(123456),
@@ -199,9 +203,11 @@ func TestAuditEntry_Marshal(t *testing.T) {
 		LimitedAvailability:   Bool(false),
 		Message:               String("m"),
 		Name:                  String("n"),
+		OldPermission:         String("op"),
 		OldUser:               String("ou"),
 		OpenSSHPublicKey:      String("osshpk"),
 		Org:                   String("o"),
+		Permission:            String("p"),
 		PreviousVisibility:    String("pv"),
 		ReadOnly:              String("ro"),
 		Repo:                  String("r"),
@@ -268,9 +274,11 @@ func TestAuditEntry_Marshal(t *testing.T) {
 		"limited_availability": false,
 		"message": "m",
 		"name": "n",
+		"old_permission": "op",
 		"old_user": "ou",
 		"openssh_public_key": "osshpk",
 		"org": "o",
+		"permission": "p",
 		"previous_visibility": "pv",
 		"read_only": "ro",
 		"repo": "r",
diff --git a/github/orgs_custom_roles.go b/github/orgs_custom_roles.go
index 41270b3..7c1b2d6 100644
--- a/github/orgs_custom_roles.go
+++ b/github/orgs_custom_roles.go
@@ -32,7 +32,7 @@ type CustomRepoRoles struct {
 //
 // GitHub API docs: https://docs.github.com/en/rest/orgs/custom-roles#list-custom-repository-roles-in-an-organization
 func (s *OrganizationsService) ListCustomRepoRoles(ctx context.Context, org string) (*OrganizationCustomRepoRoles, *Response, error) {
-	u := fmt.Sprintf("orgs/%v/custom_roles", org)
+	u := fmt.Sprintf("orgs/%v/custom-repository-roles", org)
 
 	req, err := s.client.NewRequest("GET", u, nil)
 	if err != nil {
@@ -59,9 +59,9 @@ type CreateOrUpdateCustomRoleOptions struct {
 // CreateCustomRepoRole creates a custom repository role in this organization.
 // In order to create custom repository roles in an organization, the authenticated user must be an organization owner.
 //
-// GitHub API docs: https://docs.github.com/en/rest/orgs/custom-roles#create-a-custom-role
+// GitHub API docs: https://docs.github.com/en/rest/orgs/custom-roles#create-a-custom-repository-role
 func (s *OrganizationsService) CreateCustomRepoRole(ctx context.Context, org string, opts *CreateOrUpdateCustomRoleOptions) (*CustomRepoRoles, *Response, error) {
-	u := fmt.Sprintf("orgs/%v/custom_roles", org)
+	u := fmt.Sprintf("orgs/%v/custom-repository-roles", org)
 
 	req, err := s.client.NewRequest("POST", u, opts)
 	if err != nil {
@@ -80,9 +80,9 @@ func (s *OrganizationsService) CreateCustomRepoRole(ctx context.Context, org str
 // UpdateCustomRepoRole updates a custom repository role in this organization.
 // In order to update custom repository roles in an organization, the authenticated user must be an organization owner.
 //
-// GitHub API docs: https://docs.github.com/en/rest/orgs/custom-roles#update-a-custom-role
+// GitHub API docs: https://docs.github.com/en/rest/orgs/custom-roles#update-a-custom-repository-role
 func (s *OrganizationsService) UpdateCustomRepoRole(ctx context.Context, org, roleID string, opts *CreateOrUpdateCustomRoleOptions) (*CustomRepoRoles, *Response, error) {
-	u := fmt.Sprintf("orgs/%v/custom_roles/%v", org, roleID)
+	u := fmt.Sprintf("orgs/%v/custom-repository-roles/%v", org, roleID)
 
 	req, err := s.client.NewRequest("PATCH", u, opts)
 	if err != nil {
@@ -101,9 +101,9 @@ func (s *OrganizationsService) UpdateCustomRepoRole(ctx context.Context, org, ro
 // DeleteCustomRepoRole deletes an existing custom repository role in this organization.
 // In order to delete custom repository roles in an organization, the authenticated user must be an organization owner.
 //
-// GitHub API docs: https://docs.github.com/en/rest/orgs/custom-roles#delete-a-custom-role
+// GitHub API docs: https://docs.github.com/en/rest/orgs/custom-roles#delete-a-custom-repository-role
 func (s *OrganizationsService) DeleteCustomRepoRole(ctx context.Context, org, roleID string) (*Response, error) {
-	u := fmt.Sprintf("orgs/%v/custom_roles/%v", org, roleID)
+	u := fmt.Sprintf("orgs/%v/custom-repository-roles/%v", org, roleID)
 
 	req, err := s.client.NewRequest("DELETE", u, nil)
 	if err != nil {
diff --git a/github/orgs_custom_roles_test.go b/github/orgs_custom_roles_test.go
index 720190c..0881090 100644
--- a/github/orgs_custom_roles_test.go
+++ b/github/orgs_custom_roles_test.go
@@ -18,7 +18,7 @@ func TestOrganizationsService_ListCustomRepoRoles(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
-	mux.HandleFunc("/orgs/o/custom_roles", func(w http.ResponseWriter, r *http.Request) {
+	mux.HandleFunc("/orgs/o/custom-repository-roles", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, "GET")
 		fmt.Fprint(w, `{"total_count": 1, "custom_roles": [{ "id": 1, "name": "Developer", "base_role": "write", "permissions": ["delete_alerts_code_scanning"]}]}`)
 	})
@@ -53,7 +53,7 @@ func TestOrganizationsService_CreateCustomRepoRole(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
-	mux.HandleFunc("/orgs/o/custom_roles", func(w http.ResponseWriter, r *http.Request) {
+	mux.HandleFunc("/orgs/o/custom-repository-roles", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, "POST")
 		fmt.Fprint(w, `{"id":8030,"name":"Labeler","description":"A role for issue and PR labelers","base_role":"read","permissions":["add_label"]}`)
 	})
@@ -96,7 +96,7 @@ func TestOrganizationsService_UpdateCustomRepoRole(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
-	mux.HandleFunc("/orgs/o/custom_roles/8030", func(w http.ResponseWriter, r *http.Request) {
+	mux.HandleFunc("/orgs/o/custom-repository-roles/8030", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, "PATCH")
 		fmt.Fprint(w, `{"id":8030,"name":"Updated Name","description":"Updated Description","base_role":"read","permissions":["add_label"]}`)
 	})
@@ -137,7 +137,7 @@ func TestOrganizationsService_DeleteCustomRepoRole(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
-	mux.HandleFunc("/orgs/o/custom_roles/8030", func(w http.ResponseWriter, r *http.Request) {
+	mux.HandleFunc("/orgs/o/custom-repository-roles/8030", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, "DELETE")
 		w.WriteHeader(http.StatusNoContent)
 	})
diff --git a/github/orgs_hooks_test.go b/github/orgs_hooks_test.go
index d4d4c54..0fe4556 100644
--- a/github/orgs_hooks_test.go
+++ b/github/orgs_hooks_test.go
@@ -66,7 +66,7 @@ func TestOrganizationsService_CreateHook(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
-	input := &Hook{CreatedAt: &referenceTime}
+	input := &Hook{CreatedAt: &Timestamp{referenceTime}}
 
 	mux.HandleFunc("/orgs/o/hooks", func(w http.ResponseWriter, r *http.Request) {
 		v := new(createHookRequest)
diff --git a/github/orgs_members_test.go b/github/orgs_members_test.go
index adc14f5..0b5068e 100644
--- a/github/orgs_members_test.go
+++ b/github/orgs_members_test.go
@@ -590,7 +590,7 @@ func TestOrganizationsService_ListPendingOrgInvitations(t *testing.T) {
 			Login:     String("monalisa"),
 			Email:     String("octocat@github.com"),
 			Role:      String("direct_member"),
-			CreatedAt: &createdAt,
+			CreatedAt: &Timestamp{createdAt},
 			Inviter: &User{
 				Login:             String("other_user"),
 				ID:                Int64(1),
@@ -805,7 +805,7 @@ func TestOrganizationsService_ListFailedOrgInvitations(t *testing.T) {
 			Role:         String("direct_member"),
 			FailedAt:     &Timestamp{time.Date(2017, time.January, 2, 1, 10, 0, 0, time.UTC)},
 			FailedReason: String("the reason"),
-			CreatedAt:    &createdAt,
+			CreatedAt:    &Timestamp{createdAt},
 			Inviter: &User{
 				Login:             String("other_user"),
 				ID:                Int64(1),
diff --git a/github/orgs_packages.go b/github/orgs_packages.go
index 9fb1130..0ae68aa 100644
--- a/github/orgs_packages.go
+++ b/github/orgs_packages.go
@@ -81,7 +81,7 @@ func (s *OrganizationsService) RestorePackage(ctx context.Context, org, packageT
 
 // Get all versions of a package in an organization.
 //
-// GitHub API docs: https://docs.github.com/en/rest/packages#get-all-package-versions-for-a-package-owned-by-an-organization
+// GitHub API docs: https://docs.github.com/en/rest/packages#list-package-versions-for-a-package-owned-by-an-organization
 func (s *OrganizationsService) PackageGetAllVersions(ctx context.Context, org, packageType, packageName string, opts *PackageListOptions) ([]*PackageVersion, *Response, error) {
 	u := fmt.Sprintf("orgs/%v/packages/%v/%v/versions", org, packageType, packageName)
 	u, err := addOptions(u, opts)
diff --git a/github/orgs_test.go b/github/orgs_test.go
index b30c48f..ca85af2 100644
--- a/github/orgs_test.go
+++ b/github/orgs_test.go
@@ -315,6 +315,31 @@ func TestOrganizationsService_Edit_invalidOrg(t *testing.T) {
 	testURLParseError(t, err)
 }
 
+func TestOrganizationsService_Delete(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+	})
+
+	ctx := context.Background()
+	_, err := client.Organizations.Delete(ctx, "o")
+	if err != nil {
+		t.Errorf("Organizations.Delete returned error: %v", err)
+	}
+
+	const methodName = "Delete"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Organizations.Delete(ctx, "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Organizations.Delete(ctx, "o")
+	})
+}
+
 func TestOrganizationsService_ListInstallations(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
@@ -427,7 +452,7 @@ func TestPlan_Marshal(t *testing.T) {
 		Name:          String("name"),
 		Space:         Int(1),
 		Collaborators: Int(1),
-		PrivateRepos:  Int(1),
+		PrivateRepos:  Int64(1),
 		FilledSeats:   Int(1),
 		Seats:         Int(1),
 	}
diff --git a/github/pulls.go b/github/pulls.go
index 120a1d6..6e49eba 100644
--- a/github/pulls.go
+++ b/github/pulls.go
@@ -9,7 +9,6 @@ import (
 	"bytes"
 	"context"
 	"fmt"
-	"time"
 )
 
 // PullRequestsService handles communication with the pull request related
@@ -34,10 +33,10 @@ type PullRequest struct {
 	Locked              *bool                 `json:"locked,omitempty"`
 	Title               *string               `json:"title,omitempty"`
 	Body                *string               `json:"body,omitempty"`
-	CreatedAt           *time.Time            `json:"created_at,omitempty"`
-	UpdatedAt           *time.Time            `json:"updated_at,omitempty"`
-	ClosedAt            *time.Time            `json:"closed_at,omitempty"`
-	MergedAt            *time.Time            `json:"merged_at,omitempty"`
+	CreatedAt           *Timestamp            `json:"created_at,omitempty"`
+	UpdatedAt           *Timestamp            `json:"updated_at,omitempty"`
+	ClosedAt            *Timestamp            `json:"closed_at,omitempty"`
+	MergedAt            *Timestamp            `json:"merged_at,omitempty"`
 	Labels              []*Label              `json:"labels,omitempty"`
 	User                *User                 `json:"user,omitempty"`
 	Draft               *bool                 `json:"draft,omitempty"`
diff --git a/github/pulls_comments.go b/github/pulls_comments.go
index 83e7881..1f6b726 100644
--- a/github/pulls_comments.go
+++ b/github/pulls_comments.go
@@ -33,8 +33,8 @@ type PullRequestComment struct {
 	OriginalCommitID    *string    `json:"original_commit_id,omitempty"`
 	User                *User      `json:"user,omitempty"`
 	Reactions           *Reactions `json:"reactions,omitempty"`
-	CreatedAt           *time.Time `json:"created_at,omitempty"`
-	UpdatedAt           *time.Time `json:"updated_at,omitempty"`
+	CreatedAt           *Timestamp `json:"created_at,omitempty"`
+	UpdatedAt           *Timestamp `json:"updated_at,omitempty"`
 	// AuthorAssociation is the comment author's relationship to the pull request's repository.
 	// Possible values are "COLLABORATOR", "CONTRIBUTOR", "FIRST_TIMER", "FIRST_TIME_CONTRIBUTOR", "MEMBER", "OWNER", or "NONE".
 	AuthorAssociation *string `json:"author_association,omitempty"`
diff --git a/github/pulls_comments_test.go b/github/pulls_comments_test.go
index cd6f19c..47d08d2 100644
--- a/github/pulls_comments_test.go
+++ b/github/pulls_comments_test.go
@@ -20,8 +20,8 @@ import (
 func TestPullComments_Marshal(t *testing.T) {
 	testJSONMarshal(t, &PullRequestComment{}, "{}")
 
-	createdAt := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)
-	updatedAt := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)
+	createdAt := Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)}
+	updatedAt := Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)}
 	reactions := &Reactions{
 		TotalCount: Int(1),
 		PlusOne:    Int(1),
diff --git a/github/pulls_reviews.go b/github/pulls_reviews.go
index 77bf60c..addcce4 100644
--- a/github/pulls_reviews.go
+++ b/github/pulls_reviews.go
@@ -9,7 +9,6 @@ import (
 	"context"
 	"errors"
 	"fmt"
-	"time"
 )
 
 var ErrMixedCommentStyles = errors.New("cannot use both position and side/line form comments")
@@ -20,7 +19,7 @@ type PullRequestReview struct {
 	NodeID         *string    `json:"node_id,omitempty"`
 	User           *User      `json:"user,omitempty"`
 	Body           *string    `json:"body,omitempty"`
-	SubmittedAt    *time.Time `json:"submitted_at,omitempty"`
+	SubmittedAt    *Timestamp `json:"submitted_at,omitempty"`
 	CommitID       *string    `json:"commit_id,omitempty"`
 	HTMLURL        *string    `json:"html_url,omitempty"`
 	PullRequestURL *string    `json:"pull_request_url,omitempty"`
diff --git a/github/pulls_reviews_test.go b/github/pulls_reviews_test.go
index aacc036..7931ba0 100644
--- a/github/pulls_reviews_test.go
+++ b/github/pulls_reviews_test.go
@@ -739,7 +739,7 @@ func TestPullRequestReview_Marshal(t *testing.T) {
 			SuspendedAt:     &Timestamp{referenceTime},
 		},
 		Body:              String("body"),
-		SubmittedAt:       &referenceTime,
+		SubmittedAt:       &Timestamp{referenceTime},
 		CommitID:          String("cid"),
 		HTMLURL:           String("hurl"),
 		PullRequestURL:    String("prurl"),
diff --git a/github/pulls_test.go b/github/pulls_test.go
index b498193..590483f 100644
--- a/github/pulls_test.go
+++ b/github/pulls_test.go
@@ -1162,10 +1162,10 @@ func TestPullRequest_Marshal(t *testing.T) {
 		Locked:    Bool(false),
 		Title:     String("title"),
 		Body:      String("body"),
-		CreatedAt: &referenceTime,
-		UpdatedAt: &referenceTime,
-		ClosedAt:  &referenceTime,
-		MergedAt:  &referenceTime,
+		CreatedAt: &Timestamp{referenceTime},
+		UpdatedAt: &Timestamp{referenceTime},
+		ClosedAt:  &Timestamp{referenceTime},
+		MergedAt:  &Timestamp{referenceTime},
 		Labels:    []*Label{{ID: Int64(1)}},
 		User: &User{
 			Login:           String("l"),
diff --git a/github/pulls_threads_test.go b/github/pulls_threads_test.go
index 6df2840..7c3c861 100644
--- a/github/pulls_threads_test.go
+++ b/github/pulls_threads_test.go
@@ -13,8 +13,8 @@ import (
 func TestPullRequestThread_Marshal(t *testing.T) {
 	testJSONMarshal(t, &PullRequestThread{}, "{}")
 
-	createdAt := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)
-	updatedAt := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)
+	createdAt := Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)}
+	updatedAt := Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)}
 	reactions := &Reactions{
 		TotalCount: Int(1),
 		PlusOne:    Int(1),
diff --git a/github/repos.go b/github/repos.go
index e12cff0..9c9c750 100644
--- a/github/repos.go
+++ b/github/repos.go
@@ -68,6 +68,7 @@ type Repository struct {
 	AllowMergeCommit          *bool           `json:"allow_merge_commit,omitempty"`
 	AllowAutoMerge            *bool           `json:"allow_auto_merge,omitempty"`
 	AllowForking              *bool           `json:"allow_forking,omitempty"`
+	WebCommitSignoffRequired  *bool           `json:"web_commit_signoff_required,omitempty"`
 	DeleteBranchOnMerge       *bool           `json:"delete_branch_on_merge,omitempty"`
 	UseSquashPRTitleAsDefault *bool           `json:"use_squash_pr_title_as_default,omitempty"`
 	SquashMergeCommitTitle    *string         `json:"squash_merge_commit_title,omitempty"`   // Can be one of: "PR_TITLE", "COMMIT_OR_PR_TITLE"
@@ -88,6 +89,7 @@ type Repository struct {
 	HasPages          *bool   `json:"has_pages,omitempty"`
 	HasProjects       *bool   `json:"has_projects,omitempty"`
 	HasDownloads      *bool   `json:"has_downloads,omitempty"`
+	HasDiscussions    *bool   `json:"has_discussions,omitempty"`
 	IsTemplate        *bool   `json:"is_template,omitempty"`
 	LicenseTemplate   *string `json:"license_template,omitempty"`
 	GitignoreTemplate *string `json:"gitignore_template,omitempty"`
@@ -365,12 +367,13 @@ type createRepoRequest struct {
 	Description *string `json:"description,omitempty"`
 	Homepage    *string `json:"homepage,omitempty"`
 
-	Private     *bool   `json:"private,omitempty"`
-	Visibility  *string `json:"visibility,omitempty"`
-	HasIssues   *bool   `json:"has_issues,omitempty"`
-	HasProjects *bool   `json:"has_projects,omitempty"`
-	HasWiki     *bool   `json:"has_wiki,omitempty"`
-	IsTemplate  *bool   `json:"is_template,omitempty"`
+	Private        *bool   `json:"private,omitempty"`
+	Visibility     *string `json:"visibility,omitempty"`
+	HasIssues      *bool   `json:"has_issues,omitempty"`
+	HasProjects    *bool   `json:"has_projects,omitempty"`
+	HasWiki        *bool   `json:"has_wiki,omitempty"`
+	HasDiscussions *bool   `json:"has_discussions,omitempty"`
+	IsTemplate     *bool   `json:"is_template,omitempty"`
 
 	// Creating an organization repository. Required for non-owners.
 	TeamID *int64 `json:"team_id,omitempty"`
@@ -423,6 +426,7 @@ func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repo
 		HasIssues:                 repo.HasIssues,
 		HasProjects:               repo.HasProjects,
 		HasWiki:                   repo.HasWiki,
+		HasDiscussions:            repo.HasDiscussions,
 		IsTemplate:                repo.IsTemplate,
 		TeamID:                    repo.TeamID,
 		AutoInit:                  repo.AutoInit,
@@ -492,7 +496,7 @@ func (s *RepositoriesService) CreateFromTemplate(ctx context.Context, templateOw
 
 // Get fetches a repository.
 //
-// GitHub API docs: https://docs.github.com/en/rest/repos/repos#update-a-repository
+// GitHub API docs: https://docs.github.com/en/rest/repos/repos#get-a-repository
 func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Repository, *Response, error) {
 	u := fmt.Sprintf("repos/%v/%v", owner, repo)
 	req, err := s.client.NewRequest("GET", u, nil)
@@ -840,6 +844,28 @@ type Protection struct {
 	AllowForcePushes               *AllowForcePushes               `json:"allow_force_pushes"`
 	AllowDeletions                 *AllowDeletions                 `json:"allow_deletions"`
 	RequiredConversationResolution *RequiredConversationResolution `json:"required_conversation_resolution"`
+	BlockCreations                 *BlockCreations                 `json:"block_creations,omitempty"`
+	LockBranch                     *LockBranch                     `json:"lock_branch,omitempty"`
+	AllowForkSyncing               *AllowForkSyncing               `json:"allow_fork_syncing,omitempty"`
+	RequiredSignatures             *SignaturesProtectedBranch      `json:"required_signatures,omitempty"`
+	URL                            *string                         `json:"url,omitempty"`
+}
+
+// BlockCreations represents whether users can push changes that create branches. If this is true, this
+// setting blocks pushes that create new branches, unless the push is initiated by a user, team, or app
+// which has the ability to push.
+type BlockCreations struct {
+	Enabled *bool `json:"enabled,omitempty"`
+}
+
+// LockBranch represents if the branch is marked as read-only. If this is true, users will not be able to push to the branch.
+type LockBranch struct {
+	Enabled *bool `json:"enabled,omitempty"`
+}
+
+// AllowForkSyncing represents whether users can pull changes from upstream when the branch is locked.
+type AllowForkSyncing struct {
+	Enabled *bool `json:"enabled,omitempty"`
 }
 
 // BranchProtectionRule represents the rule applied to a repositories branch.
@@ -979,6 +1005,14 @@ type ProtectionRequest struct {
 	// RequiredConversationResolution, if set to true, requires all comments
 	// on the pull request to be resolved before it can be merged to a protected branch.
 	RequiredConversationResolution *bool `json:"required_conversation_resolution,omitempty"`
+	// BlockCreations, if set to true, will cause the restrictions setting to also block pushes
+	// which create new branches, unless initiated by a user, team, app with the ability to push.
+	BlockCreations *bool `json:"block_creations,omitempty"`
+	// LockBranch, if set to true, will prevent users from pushing to the branch.
+	LockBranch *bool `json:"lock_branch,omitempty"`
+	// AllowForkSyncing, if set to true, will allow users to pull changes from upstream
+	// when the branch is locked.
+	AllowForkSyncing *bool `json:"allow_fork_syncing,omitempty"`
 }
 
 // RequiredStatusChecks represents the protection status of a individual branch.
@@ -991,7 +1025,9 @@ type RequiredStatusChecks struct {
 	Contexts []string `json:"contexts,omitempty"`
 	// The list of status checks to require in order to merge into this
 	// branch.
-	Checks []*RequiredStatusCheck `json:"checks"`
+	Checks      []*RequiredStatusCheck `json:"checks"`
+	ContextsURL *string                `json:"contexts_url,omitempty"`
+	URL         *string                `json:"url,omitempty"`
 }
 
 // RequiredStatusChecksRequest represents a request to edit a protected branch's status checks.
@@ -1028,6 +1064,8 @@ type PullRequestReviewsEnforcement struct {
 	// RequiredApprovingReviewCount specifies the number of approvals required before the pull request can be merged.
 	// Valid values are 1-6.
 	RequiredApprovingReviewCount int `json:"required_approving_review_count"`
+	// RequireLastPushApproval specifies whether the last pusher to a pull request branch can approve it.
+	RequireLastPushApproval bool `json:"require_last_push_approval"`
 }
 
 // PullRequestReviewsEnforcementRequest represents request to set the pull request review
@@ -1047,6 +1085,8 @@ type PullRequestReviewsEnforcementRequest struct {
 	// RequiredApprovingReviewCount specifies the number of approvals required before the pull request can be merged.
 	// Valid values are 1-6.
 	RequiredApprovingReviewCount int `json:"required_approving_review_count"`
+	// RequireLastPushApproval specifies whether the last pusher to a pull request branch can approve it.
+	RequireLastPushApproval *bool `json:"require_last_push_approval,omitempty"`
 }
 
 // PullRequestReviewsEnforcementUpdate represents request to patch the pull request review
@@ -1064,6 +1104,8 @@ type PullRequestReviewsEnforcementUpdate struct {
 	// RequiredApprovingReviewCount specifies the number of approvals required before the pull request can be merged.
 	// Valid values are 1 - 6 or 0 to not require reviewers.
 	RequiredApprovingReviewCount int `json:"required_approving_review_count"`
+	// RequireLastPushApproval specifies whether the last pusher to a pull request branch can approve it.
+	RequireLastPushApproval *bool `json:"require_last_push_approval,omitempty"`
 }
 
 // RequireLinearHistory represents the configuration to enforce branches with no merge commit.
@@ -1159,7 +1201,7 @@ type DismissalRestrictionsRequest struct {
 	Users *[]string `json:"users,omitempty"`
 	// The list of team slugs which can dismiss pull request reviews. (Required; use nil to disable dismissal_restrictions or &[]string{} otherwise.)
 	Teams *[]string `json:"teams,omitempty"`
-	// The list of apps which can dismiss pull request reviews. (Required; use nil to disable dismissal_restrictions or &[]string{} otherwise.)
+	// The list of app slugs which can dismiss pull request reviews. (Required; use nil to disable dismissal_restrictions or &[]string{} otherwise.)
 	Apps *[]string `json:"apps,omitempty"`
 }
 
@@ -1655,6 +1697,8 @@ func (s *RepositoriesService) ReplaceAllTopics(ctx context.Context, owner, repo
 // It requires the GitHub apps to have `write` access to the `content` permission.
 //
 // GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#get-apps-with-access-to-the-protected-branch
+//
+// Deprecated: Please use ListAppRestrictions instead.
 func (s *RepositoriesService) ListApps(ctx context.Context, owner, repo, branch string) ([]*App, *Response, error) {
 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
 	req, err := s.client.NewRequest("GET", u, nil)
@@ -1671,6 +1715,16 @@ func (s *RepositoriesService) ListApps(ctx context.Context, owner, repo, branch
 	return apps, resp, nil
 }
 
+// ListAppRestrictions lists the GitHub apps that have push access to a given protected branch.
+// It requires the GitHub apps to have `write` access to the `content` permission.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#get-apps-with-access-to-the-protected-branch
+//
+// Note: This is a wrapper around ListApps so a naming convention with ListUserRestrictions and ListTeamRestrictions is preserved.
+func (s *RepositoriesService) ListAppRestrictions(ctx context.Context, owner, repo, branch string) ([]*App, *Response, error) {
+	return s.ListApps(ctx, owner, repo, branch)
+}
+
 // ReplaceAppRestrictions replaces the apps that have push access to a given protected branch.
 // It removes all apps that previously had push access and grants push access to the new list of apps.
 // It requires the GitHub apps to have `write` access to the `content` permission.
@@ -1678,20 +1732,20 @@ func (s *RepositoriesService) ListApps(ctx context.Context, owner, repo, branch
 // Note: The list of users, apps, and teams in total is limited to 100 items.
 //
 // GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#set-app-access-restrictions
-func (s *RepositoriesService) ReplaceAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) {
+func (s *RepositoriesService) ReplaceAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) {
 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
-	req, err := s.client.NewRequest("PUT", u, slug)
+	req, err := s.client.NewRequest("PUT", u, apps)
 	if err != nil {
 		return nil, nil, err
 	}
 
-	var apps []*App
-	resp, err := s.client.Do(ctx, req, &apps)
+	var newApps []*App
+	resp, err := s.client.Do(ctx, req, &newApps)
 	if err != nil {
 		return nil, resp, err
 	}
 
-	return apps, resp, nil
+	return newApps, resp, nil
 }
 
 // AddAppRestrictions grants the specified apps push access to a given protected branch.
@@ -1700,42 +1754,216 @@ func (s *RepositoriesService) ReplaceAppRestrictions(ctx context.Context, owner,
 // Note: The list of users, apps, and teams in total is limited to 100 items.
 //
 // GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#add-app-access-restrictions
-func (s *RepositoriesService) AddAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) {
+func (s *RepositoriesService) AddAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) {
 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
-	req, err := s.client.NewRequest("POST", u, slug)
+	req, err := s.client.NewRequest("POST", u, apps)
 	if err != nil {
 		return nil, nil, err
 	}
 
-	var apps []*App
-	resp, err := s.client.Do(ctx, req, &apps)
+	var newApps []*App
+	resp, err := s.client.Do(ctx, req, &newApps)
 	if err != nil {
 		return nil, resp, err
 	}
 
-	return apps, resp, nil
+	return newApps, resp, nil
 }
 
-// RemoveAppRestrictions removes the ability of an app to push to this branch.
+// RemoveAppRestrictions removes the restrictions of an app from pushing to this branch.
 // It requires the GitHub apps to have `write` access to the `content` permission.
 //
 // Note: The list of users, apps, and teams in total is limited to 100 items.
 //
 // GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#remove-app-access-restrictions
-func (s *RepositoriesService) RemoveAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) {
+func (s *RepositoriesService) RemoveAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) {
 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
-	req, err := s.client.NewRequest("DELETE", u, slug)
+	req, err := s.client.NewRequest("DELETE", u, apps)
 	if err != nil {
 		return nil, nil, err
 	}
 
-	var apps []*App
-	resp, err := s.client.Do(ctx, req, &apps)
+	var newApps []*App
+	resp, err := s.client.Do(ctx, req, &newApps)
 	if err != nil {
 		return nil, resp, err
 	}
 
-	return apps, resp, nil
+	return newApps, resp, nil
+}
+
+// ListTeamRestrictions lists the GitHub teams that have push access to a given protected branch.
+// It requires the GitHub teams to have `write` access to the `content` permission.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#get-teams-with-access-to-the-protected-branch
+func (s *RepositoriesService) ListTeamRestrictions(ctx context.Context, owner, repo, branch string) ([]*Team, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, branch)
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var teams []*Team
+	resp, err := s.client.Do(ctx, req, &teams)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return teams, resp, nil
+}
+
+// ReplaceTeamRestrictions replaces the team that have push access to a given protected branch.
+// This removes all teams that previously had push access and grants push access to the new list of teams.
+// It requires the GitHub teams to have `write` access to the `content` permission.
+//
+// Note: The list of users, apps, and teams in total is limited to 100 items.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#set-team-access-restrictions
+func (s *RepositoriesService) ReplaceTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, branch)
+	req, err := s.client.NewRequest("PUT", u, teams)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var newTeams []*Team
+	resp, err := s.client.Do(ctx, req, &newTeams)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return newTeams, resp, nil
+}
+
+// AddTeamRestrictions grants the specified teams push access to a given protected branch.
+// It requires the GitHub teams to have `write` access to the `content` permission.
+//
+// Note: The list of users, apps, and teams in total is limited to 100 items.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#add-team-access-restrictions
+func (s *RepositoriesService) AddTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, branch)
+	req, err := s.client.NewRequest("POST", u, teams)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var newTeams []*Team
+	resp, err := s.client.Do(ctx, req, &newTeams)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return newTeams, resp, nil
+}
+
+// RemoveTeamRestrictions removes the restrictions of a team from pushing to this branch.
+// It requires the GitHub teams to have `write` access to the `content` permission.
+//
+// Note: The list of users, apps, and teams in total is limited to 100 items.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#remove-team-access-restrictions
+func (s *RepositoriesService) RemoveTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, branch)
+	req, err := s.client.NewRequest("DELETE", u, teams)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var newTeams []*Team
+	resp, err := s.client.Do(ctx, req, &newTeams)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return newTeams, resp, nil
+}
+
+// ListUserRestrictions lists the GitHub users that have push access to a given protected branch.
+// It requires the GitHub users to have `write` access to the `content` permission.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#get-users-with-access-to-the-protected-branch
+func (s *RepositoriesService) ListUserRestrictions(ctx context.Context, owner, repo, branch string) ([]*User, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, branch)
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var users []*User
+	resp, err := s.client.Do(ctx, req, &users)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return users, resp, nil
+}
+
+// ReplaceUserRestrictions replaces the user that have push access to a given protected branch.
+// It removes all users that previously had push access and grants push access to the new list of users.
+// It requires the GitHub users to have `write` access to the `content` permission.
+//
+// Note: The list of users, apps, and teams in total is limited to 100 items.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#set-team-access-restrictions
+func (s *RepositoriesService) ReplaceUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, branch)
+	req, err := s.client.NewRequest("PUT", u, users)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var newUsers []*User
+	resp, err := s.client.Do(ctx, req, &newUsers)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return newUsers, resp, nil
+}
+
+// AddUserRestrictions grants the specified users push access to a given protected branch.
+// It requires the GitHub users to have `write` access to the `content` permission.
+//
+// Note: The list of users, apps, and teams in total is limited to 100 items.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#add-team-access-restrictions
+func (s *RepositoriesService) AddUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, branch)
+	req, err := s.client.NewRequest("POST", u, users)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var newUsers []*User
+	resp, err := s.client.Do(ctx, req, &newUsers)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return newUsers, resp, nil
+}
+
+// RemoveUserRestrictions removes the restrictions of a user from pushing to this branch.
+// It requires the GitHub users to have `write` access to the `content` permission.
+//
+// Note: The list of users, apps, and teams in total is limited to 100 items.
+//
+// GitHub API docs: https://docs.github.com/en/rest/branches/branch-protection#remove-team-access-restrictions
+func (s *RepositoriesService) RemoveUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, branch)
+	req, err := s.client.NewRequest("DELETE", u, users)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var newUsers []*User
+	resp, err := s.client.Do(ctx, req, &newUsers)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return newUsers, resp, nil
 }
 
 // TransferRequest represents a request to transfer a repository.
diff --git a/github/repos_actions_access.go b/github/repos_actions_access.go
new file mode 100644
index 0000000..55761ee
--- /dev/null
+++ b/github/repos_actions_access.go
@@ -0,0 +1,55 @@
+// Copyright 2022 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+)
+
+// RepositoryActionsAccessLevel represents the repository actions access level.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/permissions#set-the-level-of-access-for-workflows-outside-of-the-repository
+type RepositoryActionsAccessLevel struct {
+	// AccessLevel specifies the level of access that workflows outside of the repository have
+	// to actions and reusable workflows within the repository.
+	// Possible values are: "none", "organization" "enterprise".
+	AccessLevel *string `json:"access_level,omitempty"`
+}
+
+// GetActionsAccessLevel gets the level of access that workflows outside of the repository have
+// to actions and reusable workflows in the repository.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/permissions#get-the-level-of-access-for-workflows-outside-of-the-repository
+func (s *RepositoriesService) GetActionsAccessLevel(ctx context.Context, owner, repo string) (*RepositoryActionsAccessLevel, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/permissions/access", owner, repo)
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	raal := new(RepositoryActionsAccessLevel)
+	resp, err := s.client.Do(ctx, req, raal)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return raal, resp, nil
+}
+
+// EditActionsAccessLevel sets the level of access that workflows outside of the repository have
+// to actions and reusable workflows in the repository.
+//
+// GitHub API docs: https://docs.github.com/en/rest/actions/permissions#set-the-level-of-access-for-workflows-outside-of-the-repository
+func (s *RepositoriesService) EditActionsAccessLevel(ctx context.Context, owner, repo string, repositoryActionsAccessLevel RepositoryActionsAccessLevel) (*Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/actions/permissions/access", owner, repo)
+	req, err := s.client.NewRequest("PUT", u, repositoryActionsAccessLevel)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
diff --git a/github/repos_actions_access_test.go b/github/repos_actions_access_test.go
new file mode 100644
index 0000000..7085ac7
--- /dev/null
+++ b/github/repos_actions_access_test.go
@@ -0,0 +1,98 @@
+// Copyright 2022 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+)
+
+func TestRepositoriesService_GetActionsAccessLevel(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/actions/permissions/access", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprintf(w, `{"access_level": "none"}`)
+	})
+
+	ctx := context.Background()
+	org, _, err := client.Repositories.GetActionsAccessLevel(ctx, "o", "r")
+	if err != nil {
+		t.Errorf("Repositories.GetActionsAccessLevel returned error: %v", err)
+	}
+	want := &RepositoryActionsAccessLevel{AccessLevel: String("none")}
+	if !cmp.Equal(org, want) {
+		t.Errorf("Repositories.GetActionsAccessLevel returned %+v, want %+v", org, want)
+	}
+
+	const methodName = "GetActionsAccessLevel"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.GetActionsAccessLevel(ctx, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.GetActionsAccessLevel(ctx, "o", "r")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_EditActionsAccessLevel(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	input := &RepositoryActionsAccessLevel{AccessLevel: String("organization")}
+
+	mux.HandleFunc("/repos/o/r/actions/permissions/access", func(w http.ResponseWriter, r *http.Request) {
+		v := new(RepositoryActionsAccessLevel)
+		json.NewDecoder(r.Body).Decode(v)
+
+		testMethod(t, r, "PUT")
+		if !cmp.Equal(v, input) {
+			t.Errorf("Request body = %+v, want %+v", v, input)
+		}
+	})
+
+	ctx := context.Background()
+	_, err := client.Repositories.EditActionsAccessLevel(ctx, "o", "r", *input)
+	if err != nil {
+		t.Errorf("Repositories.EditActionsAccessLevel returned error: %v", err)
+	}
+
+	const methodName = "EditActionsAccessLevel"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Repositories.EditActionsAccessLevel(ctx, "\n", "\n", *input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		resp, err := client.Repositories.EditActionsAccessLevel(ctx, "o", "r", *input)
+		return resp, err
+	})
+}
+
+func TestRepositoryActionsAccessLevel_Marshal(t *testing.T) {
+	testJSONMarshal(t, &ActionsPermissions{}, "{}")
+
+	u := &RepositoryActionsAccessLevel{
+		AccessLevel: String("enterprise"),
+	}
+
+	want := `{
+		"access_level": "enterprise"
+	}`
+
+	testJSONMarshal(t, u, want)
+}
diff --git a/github/repos_collaborators.go b/github/repos_collaborators.go
index abc4161..c239687 100644
--- a/github/repos_collaborators.go
+++ b/github/repos_collaborators.go
@@ -23,6 +23,13 @@ type ListCollaboratorsOptions struct {
 	// Default value is "all".
 	Affiliation string `url:"affiliation,omitempty"`
 
+	// Permission specifies how collaborators should be filtered by the permissions they have on the repository.
+	// Possible values are:
+	// "pull", "triage", "push", "maintain", "admin"
+	//
+	// If not specified, all collaborators will be returned.
+	Permission string `url:"permission,omitempty"`
+
 	ListOptions
 }
 
diff --git a/github/repos_collaborators_test.go b/github/repos_collaborators_test.go
index 8bb6c15..8953d36 100644
--- a/github/repos_collaborators_test.go
+++ b/github/repos_collaborators_test.go
@@ -94,6 +94,46 @@ func TestRepositoriesService_ListCollaborators_withAffiliation(t *testing.T) {
 	})
 }
 
+func TestRepositoriesService_ListCollaborators_withPermission(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"permission": "pull", "page": "2"})
+		fmt.Fprintf(w, `[{"id":1}, {"id":2}]`)
+	})
+
+	opt := &ListCollaboratorsOptions{
+		ListOptions: ListOptions{Page: 2},
+		Permission:  "pull",
+	}
+	ctx := context.Background()
+	users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt)
+	if err != nil {
+		t.Errorf("Repositories.ListCollaborators returned error: %v", err)
+	}
+
+	want := []*User{{ID: Int64(1)}, {ID: Int64(2)}}
+	if !cmp.Equal(users, want) {
+		t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want)
+	}
+
+	const methodName = "ListCollaborators"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
 func TestRepositoriesService_ListCollaborators_invalidOwner(t *testing.T) {
 	client, _, _, teardown := setup()
 	defer teardown()
diff --git a/github/repos_comments.go b/github/repos_comments.go
index 55a88d1..e282374 100644
--- a/github/repos_comments.go
+++ b/github/repos_comments.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // RepositoryComment represents a comment for a commit, file, or line in a repository.
@@ -20,8 +19,8 @@ type RepositoryComment struct {
 	CommitID  *string    `json:"commit_id,omitempty"`
 	User      *User      `json:"user,omitempty"`
 	Reactions *Reactions `json:"reactions,omitempty"`
-	CreatedAt *time.Time `json:"created_at,omitempty"`
-	UpdatedAt *time.Time `json:"updated_at,omitempty"`
+	CreatedAt *Timestamp `json:"created_at,omitempty"`
+	UpdatedAt *Timestamp `json:"updated_at,omitempty"`
 
 	// User-mutable fields
 	Body *string `json:"body"`
diff --git a/github/repos_comments_test.go b/github/repos_comments_test.go
index 3dbc10c..b3579bf 100644
--- a/github/repos_comments_test.go
+++ b/github/repos_comments_test.go
@@ -335,8 +335,8 @@ func TestRepositoryComment_Marshal(t *testing.T) {
 			Eyes:       Int(1),
 			URL:        String("u"),
 		},
-		CreatedAt: &referenceTime,
-		UpdatedAt: &referenceTime,
+		CreatedAt: &Timestamp{referenceTime},
+		UpdatedAt: &Timestamp{referenceTime},
 		Body:      String("body"),
 		Path:      String("path"),
 		Position:  Int(1),
diff --git a/github/repos_commits_test.go b/github/repos_commits_test.go
index 1ce068c..5840e67 100644
--- a/github/repos_commits_test.go
+++ b/github/repos_commits_test.go
@@ -14,8 +14,8 @@ import (
 	"testing"
 	"time"
 
+	"github.com/ProtonMail/go-crypto/openpgp"
 	"github.com/google/go-cmp/cmp"
-	"golang.org/x/crypto/openpgp"
 )
 
 func TestRepositoriesService_ListCommits(t *testing.T) {
@@ -672,13 +672,13 @@ func TestBranchCommit_Marshal(t *testing.T) {
 		Commit: &Commit{
 			SHA: String("s"),
 			Author: &CommitAuthor{
-				Date:  &referenceTime,
+				Date:  &Timestamp{referenceTime},
 				Name:  String("n"),
 				Email: String("e"),
 				Login: String("u"),
 			},
 			Committer: &CommitAuthor{
-				Date:  &referenceTime,
+				Date:  &Timestamp{referenceTime},
 				Name:  String("n"),
 				Email: String("e"),
 				Login: String("u"),
diff --git a/github/repos_community_health.go b/github/repos_community_health.go
index 9de438b..750ee15 100644
--- a/github/repos_community_health.go
+++ b/github/repos_community_health.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // Metric represents the different fields for one file in community health files.
@@ -38,7 +37,7 @@ type CommunityHealthMetrics struct {
 	Description           *string               `json:"description"`
 	Documentation         *string               `json:"documentation"`
 	Files                 *CommunityHealthFiles `json:"files"`
-	UpdatedAt             *time.Time            `json:"updated_at"`
+	UpdatedAt             *Timestamp            `json:"updated_at"`
 	ContentReportsEnabled *bool                 `json:"content_reports_enabled"`
 }
 
diff --git a/github/repos_community_health_test.go b/github/repos_community_health_test.go
index 0031cdb..6ff88bd 100644
--- a/github/repos_community_health_test.go
+++ b/github/repos_community_health_test.go
@@ -76,7 +76,7 @@ func TestRepositoriesService_GetCommunityHealthMetrics(t *testing.T) {
 	want := &CommunityHealthMetrics{
 		HealthPercentage:      Int(100),
 		Description:           String("My first repository on GitHub!"),
-		UpdatedAt:             &updatedAt,
+		UpdatedAt:             &Timestamp{updatedAt},
 		ContentReportsEnabled: Bool(true),
 		Files: &CommunityHealthFiles{
 			CodeOfConduct: &Metric{
@@ -310,7 +310,7 @@ func TestCommunityHealthMetrics_Marshal(t *testing.T) {
 				HTMLURL: String("hurl"),
 			},
 		},
-		UpdatedAt:             &referenceTime,
+		UpdatedAt:             &Timestamp{referenceTime},
 		ContentReportsEnabled: Bool(true),
 	}
 
diff --git a/github/repos_contents_test.go b/github/repos_contents_test.go
index f5de557..29262ce 100644
--- a/github/repos_contents_test.go
+++ b/github/repos_contents_test.go
@@ -14,8 +14,8 @@ import (
 	"net/url"
 	"testing"
 
+	"github.com/ProtonMail/go-crypto/openpgp"
 	"github.com/google/go-cmp/cmp"
-	"golang.org/x/crypto/openpgp"
 )
 
 func TestRepositoryContent_GetContent(t *testing.T) {
@@ -744,23 +744,6 @@ func TestRepositoriesService_GetArchiveLink_StatusMovedPermanently_followRedirec
 	}
 }
 
-func TestRepositoriesService_GetArchiveLink_invalidLocationHeader(t *testing.T) {
-	client, mux, _, teardown := setup()
-	defer teardown()
-
-	mux.HandleFunc("/repos/o/r/tarball", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, "GET")
-		ctlChar := 0x7f
-		badURL := "https://google.com" + string(byte(ctlChar))
-		w.Header().Add("Location", badURL)
-		w.WriteHeader(http.StatusFound)
-	})
-
-	ctx := context.Background()
-	_, _, err := client.Repositories.GetArchiveLink(ctx, "o", "r", Tarball, &RepositoryContentGetOptions{}, false)
-	testURLParseError(t, err)
-}
-
 func TestRepositoriesService_GetContents_NoTrailingSlashInDirectoryApiPath(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
@@ -838,13 +821,13 @@ func TestRepositoryContentResponse_Marshal(t *testing.T) {
 		Commit: Commit{
 			SHA: String("s"),
 			Author: &CommitAuthor{
-				Date:  &referenceTime,
+				Date:  &Timestamp{referenceTime},
 				Name:  String("n"),
 				Email: String("e"),
 				Login: String("u"),
 			},
 			Committer: &CommitAuthor{
-				Date:  &referenceTime,
+				Date:  &Timestamp{referenceTime},
 				Name:  String("n"),
 				Email: String("e"),
 				Login: String("u"),
@@ -958,13 +941,13 @@ func TestRepositoryContentFileOptions_Marshal(t *testing.T) {
 		SHA:     String("type"),
 		Branch:  String("type"),
 		Author: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("name"),
 			Email: String("email"),
 			Login: String("login"),
 		},
 		Committer: &CommitAuthor{
-			Date:  &referenceTime,
+			Date:  &Timestamp{referenceTime},
 			Name:  String("name"),
 			Email: String("email"),
 			Login: String("login"),
diff --git a/github/repos_deployment_branch_policies.go b/github/repos_deployment_branch_policies.go
new file mode 100644
index 0000000..8c4628b
--- /dev/null
+++ b/github/repos_deployment_branch_policies.go
@@ -0,0 +1,123 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+)
+
+// DeploymentBranchPolicy represents a single deployment branch policy for an environment.
+type DeploymentBranchPolicy struct {
+	Name   *string `json:"name,omitempty"`
+	ID     *int64  `json:"id,omitempty"`
+	NodeID *string `json:"node_id,omitempty"`
+}
+
+// DeploymentBranchPolicyResponse represents the slightly different format of response that comes back when you list deployment branch policies.
+type DeploymentBranchPolicyResponse struct {
+	TotalCount     *int                      `json:"total_count,omitempty"`
+	BranchPolicies []*DeploymentBranchPolicy `json:"branch_policies,omitempty"`
+}
+
+// DeploymentBranchPolicyRequest represents a deployment branch policy request.
+type DeploymentBranchPolicyRequest struct {
+	Name *string `json:"name,omitempty"`
+}
+
+// ListDeploymentBranchPolicies lists the deployment branch policies for an environment.
+//
+// GitHub API docs: https://docs.github.com/en/rest/deployments/branch-policies#list-deployment-branch-policies
+func (s *RepositoriesService) ListDeploymentBranchPolicies(ctx context.Context, owner, repo, environment string) (*DeploymentBranchPolicyResponse, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies", owner, repo, environment)
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var list *DeploymentBranchPolicyResponse
+	resp, err := s.client.Do(ctx, req, &list)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return list, resp, nil
+}
+
+// GetDeploymentBranchPolicy gets a deployment branch policy for an environment.
+//
+// GitHub API docs: https://docs.github.com/en/rest/deployments/branch-policies#get-a-deployment-branch-policy
+func (s *RepositoriesService) GetDeploymentBranchPolicy(ctx context.Context, owner, repo, environment string, branchPolicyID int64) (*DeploymentBranchPolicy, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies/%v", owner, repo, environment, branchPolicyID)
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var policy *DeploymentBranchPolicy
+	resp, err := s.client.Do(ctx, req, &policy)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return policy, resp, nil
+}
+
+// CreateDeploymentBranchPolicy creates a deployment branch policy for an environment.
+//
+// GitHub API docs: https://docs.github.com/en/rest/deployments/branch-policies#create-a-deployment-branch-policy
+func (s *RepositoriesService) CreateDeploymentBranchPolicy(ctx context.Context, owner, repo, environment string, request *DeploymentBranchPolicyRequest) (*DeploymentBranchPolicy, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies", owner, repo, environment)
+
+	req, err := s.client.NewRequest("POST", u, request)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var policy *DeploymentBranchPolicy
+	resp, err := s.client.Do(ctx, req, &policy)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return policy, resp, nil
+}
+
+// UpdateDeploymentBranchPolicy updates a deployment branch policy for an environment.
+//
+// GitHub API docs: https://docs.github.com/en/rest/deployments/branch-policies#update-a-deployment-branch-policy
+func (s *RepositoriesService) UpdateDeploymentBranchPolicy(ctx context.Context, owner, repo, environment string, branchPolicyID int64, request *DeploymentBranchPolicyRequest) (*DeploymentBranchPolicy, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies/%v", owner, repo, environment, branchPolicyID)
+
+	req, err := s.client.NewRequest("PUT", u, request)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var policy *DeploymentBranchPolicy
+	resp, err := s.client.Do(ctx, req, &policy)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return policy, resp, nil
+}
+
+// DeleteDeploymentBranchPolicy deletes a deployment branch policy for an environment.
+//
+// GitHub API docs: https://docs.github.com/en/rest/deployments/branch-policies#delete-a-deployment-branch-policy
+func (s *RepositoriesService) DeleteDeploymentBranchPolicy(ctx context.Context, owner, repo, environment string, branchPolicyID int64) (*Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies/%v", owner, repo, environment, branchPolicyID)
+
+	req, err := s.client.NewRequest("DELETE", u, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(ctx, req, nil)
+}
diff --git a/github/repos_deployment_branch_policies_test.go b/github/repos_deployment_branch_policies_test.go
new file mode 100644
index 0000000..69bffac
--- /dev/null
+++ b/github/repos_deployment_branch_policies_test.go
@@ -0,0 +1,158 @@
+// Copyright 2023 The go-github AUTHORS. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package github
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"reflect"
+	"testing"
+)
+
+func TestRepositoriesService_ListDeploymentBranchPolicies(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies", func(w http.ResponseWriter, r *http.Request) {
+		fmt.Fprint(w, `{"total_count":2, "branch_policies":[{"id":1}, {"id": 2}]}`)
+	})
+
+	ctx := context.Background()
+	got, _, err := client.Repositories.ListDeploymentBranchPolicies(ctx, "o", "r", "e")
+	if err != nil {
+		t.Errorf("Repositories.ListDeploymentBranchPolicies returned error: %v", err)
+	}
+
+	want := &DeploymentBranchPolicyResponse{
+		BranchPolicies: []*DeploymentBranchPolicy{
+			{ID: Int64(1)},
+			{ID: Int64(2)},
+		},
+		TotalCount: Int(2),
+	}
+	if !reflect.DeepEqual(got, want) {
+		t.Errorf("Repositories.ListDeploymentBranchPolicies = %+v, want %+v", got, want)
+	}
+
+	const methodName = "ListDeploymentBranchPolicies"
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.ListDeploymentBranchPolicies(ctx, "o", "r", "e")
+		if got != nil {
+			t.Errorf("got non-nil Repositories.ListDeploymentBranchPolicies response: %+v", got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_GetDeploymentBranchPolicy(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies/1", func(w http.ResponseWriter, r *http.Request) {
+		fmt.Fprint(w, `{"id":1}`)
+	})
+
+	ctx := context.Background()
+	got, _, err := client.Repositories.GetDeploymentBranchPolicy(ctx, "o", "r", "e", 1)
+	if err != nil {
+		t.Errorf("Repositories.GetDeploymentBranchPolicy returned error: %v", err)
+	}
+
+	want := &DeploymentBranchPolicy{ID: Int64(1)}
+	if !reflect.DeepEqual(got, want) {
+		t.Errorf("Repositories.GetDeploymentBranchPolicy = %+v, want %+v", got, want)
+	}
+
+	const methodName = "GetDeploymentBranchPolicy"
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.GetDeploymentBranchPolicy(ctx, "o", "r", "e", 1)
+		if got != nil {
+			t.Errorf("got non-nil Repositories.GetDeploymentBranchPolicy response: %+v", got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_CreateDeploymentBranchPolicy(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "POST")
+		fmt.Fprint(w, `{"id":1}`)
+	})
+
+	ctx := context.Background()
+	got, _, err := client.Repositories.CreateDeploymentBranchPolicy(ctx, "o", "r", "e", &DeploymentBranchPolicyRequest{Name: String("n")})
+	if err != nil {
+		t.Errorf("Repositories.CreateDeploymentBranchPolicy returned error: %v", err)
+	}
+
+	want := &DeploymentBranchPolicy{ID: Int64(1)}
+	if !reflect.DeepEqual(got, want) {
+		t.Errorf("Repositories.CreateDeploymentBranchPolicy = %+v, want %+v", got, want)
+	}
+
+	const methodName = "CreateDeploymentBranchPolicy"
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.CreateDeploymentBranchPolicy(ctx, "o", "r", "e", &DeploymentBranchPolicyRequest{Name: String("n")})
+		if got != nil {
+			t.Errorf("got non-nil Repositories.CreateDeploymentBranchPolicy response: %+v", got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_UpdateDeploymentBranchPolicy(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies/1", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		fmt.Fprint(w, `{"id":1}`)
+	})
+
+	ctx := context.Background()
+	got, _, err := client.Repositories.UpdateDeploymentBranchPolicy(ctx, "o", "r", "e", 1, &DeploymentBranchPolicyRequest{Name: String("n")})
+	if err != nil {
+		t.Errorf("Repositories.UpdateDeploymentBranchPolicy returned error: %v", err)
+	}
+
+	want := &DeploymentBranchPolicy{ID: Int64(1)}
+	if !reflect.DeepEqual(got, want) {
+		t.Errorf("Repositories.UpdateDeploymentBranchPolicy = %+v, want %+v", got, want)
+	}
+
+	const methodName = "UpdateDeploymentBranchPolicy"
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.UpdateDeploymentBranchPolicy(ctx, "o", "r", "e", 1, &DeploymentBranchPolicyRequest{Name: String("n")})
+		if got != nil {
+			t.Errorf("got non-nil Repositories.UpdateDeploymentBranchPolicy response: %+v", got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_DeleteDeploymentBranchPolicy(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies/1", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+	})
+
+	ctx := context.Background()
+	_, err := client.Repositories.DeleteDeploymentBranchPolicy(ctx, "o", "r", "e", 1)
+	if err != nil {
+		t.Errorf("Repositories.DeleteDeploymentBranchPolicy returned error: %v", err)
+	}
+
+	const methodName = "DeleteDeploymentBranchPolicy"
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Repositories.DeleteDeploymentBranchPolicy(ctx, "o", "r", "e", 1)
+	})
+}
diff --git a/github/repos_environments.go b/github/repos_environments.go
index 365f8d9..2399a42 100644
--- a/github/repos_environments.go
+++ b/github/repos_environments.go
@@ -9,6 +9,7 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"net/http"
 )
 
 // Environment represents a single environment in a repository.
@@ -27,6 +28,7 @@ type Environment struct {
 	HTMLURL         *string           `json:"html_url,omitempty"`
 	CreatedAt       *Timestamp        `json:"created_at,omitempty"`
 	UpdatedAt       *Timestamp        `json:"updated_at,omitempty"`
+	CanAdminsBypass *bool             `json:"can_admins_bypass,omitempty"`
 	ProtectionRules []*ProtectionRule `json:"protection_rules,omitempty"`
 }
 
@@ -146,11 +148,15 @@ func (s *RepositoriesService) GetEnvironment(ctx context.Context, owner, repo, n
 
 // MarshalJSON implements the json.Marshaler interface.
 // As the only way to clear a WaitTimer is to set it to 0, a missing WaitTimer object should default to 0, not null.
+// As the default value for CanAdminsBypass is true, a nil value here marshals to true.
 func (c *CreateUpdateEnvironment) MarshalJSON() ([]byte, error) {
 	type Alias CreateUpdateEnvironment
 	if c.WaitTimer == nil {
 		c.WaitTimer = Int(0)
 	}
+	if c.CanAdminsBypass == nil {
+		c.CanAdminsBypass = Bool(true)
+	}
 	return json.Marshal(&struct {
 		*Alias
 	}{
@@ -165,9 +171,17 @@ func (c *CreateUpdateEnvironment) MarshalJSON() ([]byte, error) {
 type CreateUpdateEnvironment struct {
 	WaitTimer              *int            `json:"wait_timer"`
 	Reviewers              []*EnvReviewers `json:"reviewers"`
+	CanAdminsBypass        *bool           `json:"can_admins_bypass"`
 	DeploymentBranchPolicy *BranchPolicy   `json:"deployment_branch_policy"`
 }
 
+// createUpdateEnvironmentNoEnterprise represents the fields accepted for Pro/Teams private repos.
+// Ref: https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment
+// See https://github.com/google/go-github/issues/2602 for more information.
+type createUpdateEnvironmentNoEnterprise struct {
+	DeploymentBranchPolicy *BranchPolicy `json:"deployment_branch_policy"`
+}
+
 // CreateUpdateEnvironment create or update a new environment for a repository.
 //
 // GitHub API docs: https://docs.github.com/en/rest/deployments/environments#create-or-update-an-environment
@@ -179,6 +193,33 @@ func (s *RepositoriesService) CreateUpdateEnvironment(ctx context.Context, owner
 		return nil, nil, err
 	}
 
+	e := new(Environment)
+	resp, err := s.client.Do(ctx, req, e)
+	if err != nil {
+		// The API returns 422 when the pricing plan doesn't support all the fields sent.
+		// This path will be executed for Pro/Teams private repos.
+		// For public repos, regardless of the pricing plan, all fields supported.
+		// For Free plan private repos the returned error code is 404.
+		// We are checking that the user didn't try to send a value for unsupported fields,
+		// and return an error if they did.
+		if resp != nil && resp.StatusCode == http.StatusUnprocessableEntity && environment != nil && len(environment.Reviewers) == 0 && environment.GetWaitTimer() == 0 {
+			return s.createNewEnvNoEnterprise(ctx, u, environment)
+		}
+		return nil, resp, err
+	}
+	return e, resp, nil
+}
+
+// createNewEnvNoEnterprise is an internal function for cases where the original call returned 422.
+// Currently only the `deployment_branch_policy` parameter is supported for Pro/Team private repos.
+func (s *RepositoriesService) createNewEnvNoEnterprise(ctx context.Context, u string, environment *CreateUpdateEnvironment) (*Environment, *Response, error) {
+	req, err := s.client.NewRequest("PUT", u, &createUpdateEnvironmentNoEnterprise{
+		DeploymentBranchPolicy: environment.DeploymentBranchPolicy,
+	})
+	if err != nil {
+		return nil, nil, err
+	}
+
 	e := new(Environment)
 	resp, err := s.client.Do(ctx, req, e)
 	if err != nil {
diff --git a/github/repos_environments_test.go b/github/repos_environments_test.go
index 93d0fc2..0f93d29 100644
--- a/github/repos_environments_test.go
+++ b/github/repos_environments_test.go
@@ -93,7 +93,7 @@ func TestCreateUpdateEnvironment_MarshalJSON(t *testing.T) {
 		t.Errorf("MarshalJSON: %v", err)
 	}
 
-	want := `{"wait_timer":0,"reviewers":null,"deployment_branch_policy":null}`
+	want := `{"wait_timer":0,"reviewers":null,"can_admins_bypass":true,"deployment_branch_policy":null}`
 	if string(got) != want {
 		t.Errorf("MarshalJSON = %s, want %v", got, want)
 	}
@@ -145,7 +145,7 @@ func TestRepositoriesService_GetEnvironment(t *testing.T) {
 
 	mux.HandleFunc("/repos/o/r/environments/e", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, "GET")
-		fmt.Fprint(w, `{"id": 1,"name": "staging", "deployment_branch_policy": {"protected_branches": true,	"custom_branch_policies": false}}`)
+		fmt.Fprint(w, `{"id": 1,"name": "staging", "deployment_branch_policy": {"protected_branches": true,	"custom_branch_policies": false}, "can_admins_bypass": false}`)
 	})
 
 	ctx := context.Background()
@@ -154,7 +154,7 @@ func TestRepositoriesService_GetEnvironment(t *testing.T) {
 		t.Errorf("Repositories.GetEnvironment returned error: %v\n%v", err, resp.Body)
 	}
 
-	want := &Environment{ID: Int64(1), Name: String("staging"), DeploymentBranchPolicy: &BranchPolicy{ProtectedBranches: Bool(true), CustomBranchPolicies: Bool(false)}}
+	want := &Environment{ID: Int64(1), Name: String("staging"), DeploymentBranchPolicy: &BranchPolicy{ProtectedBranches: Bool(true), CustomBranchPolicies: Bool(false)}, CanAdminsBypass: Bool(false)}
 	if !cmp.Equal(release, want) {
 		t.Errorf("Repositories.GetEnvironment returned %+v, want %+v", release, want)
 	}
@@ -187,7 +187,7 @@ func TestRepositoriesService_CreateEnvironment(t *testing.T) {
 		json.NewDecoder(r.Body).Decode(v)
 
 		testMethod(t, r, "PUT")
-		want := &CreateUpdateEnvironment{WaitTimer: Int(30)}
+		want := &CreateUpdateEnvironment{WaitTimer: Int(30), CanAdminsBypass: Bool(true)}
 		if !cmp.Equal(v, want) {
 			t.Errorf("Request body = %+v, want %+v", v, want)
 		}
@@ -220,6 +220,110 @@ func TestRepositoriesService_CreateEnvironment(t *testing.T) {
 	})
 }
 
+func TestRepositoriesService_CreateEnvironment_noEnterprise(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	input := &CreateUpdateEnvironment{}
+	callCount := 0
+
+	mux.HandleFunc("/repos/o/r/environments/e", func(w http.ResponseWriter, r *http.Request) {
+		v := new(CreateUpdateEnvironment)
+		json.NewDecoder(r.Body).Decode(v)
+
+		testMethod(t, r, "PUT")
+		if callCount == 0 {
+			w.WriteHeader(http.StatusUnprocessableEntity)
+			callCount++
+		} else {
+			want := &CreateUpdateEnvironment{}
+			if !cmp.Equal(v, want) {
+				t.Errorf("Request body = %+v, want %+v", v, want)
+			}
+			fmt.Fprint(w, `{"id": 1, "name": "staging",	"protection_rules": []}`)
+		}
+	})
+
+	ctx := context.Background()
+	release, _, err := client.Repositories.CreateUpdateEnvironment(ctx, "o", "r", "e", input)
+	if err != nil {
+		t.Errorf("Repositories.CreateUpdateEnvironment returned error: %v", err)
+	}
+
+	want := &Environment{ID: Int64(1), Name: String("staging"), ProtectionRules: []*ProtectionRule{}}
+	if !cmp.Equal(release, want) {
+		t.Errorf("Repositories.CreateUpdateEnvironment returned %+v, want %+v", release, want)
+	}
+}
+
+func TestRepositoriesService_createNewEnvNoEnterprise(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	input := &CreateUpdateEnvironment{
+		DeploymentBranchPolicy: &BranchPolicy{
+			ProtectedBranches:    Bool(true),
+			CustomBranchPolicies: Bool(false),
+		},
+	}
+
+	mux.HandleFunc("/repos/o/r/environments/e", func(w http.ResponseWriter, r *http.Request) {
+		v := new(createUpdateEnvironmentNoEnterprise)
+		json.NewDecoder(r.Body).Decode(v)
+
+		testMethod(t, r, "PUT")
+		want := &createUpdateEnvironmentNoEnterprise{
+			DeploymentBranchPolicy: &BranchPolicy{
+				ProtectedBranches:    Bool(true),
+				CustomBranchPolicies: Bool(false),
+			},
+		}
+		if !cmp.Equal(v, want) {
+			t.Errorf("Request body = %+v, want %+v", v, want)
+		}
+		fmt.Fprint(w, `{"id": 1, "name": "staging",	"protection_rules": [{"id": 1, "node_id": "id", "type": "branch_policy"}], "deployment_branch_policy": {"protected_branches": true, "custom_branch_policies": false}}`)
+	})
+
+	ctx := context.Background()
+	release, _, err := client.Repositories.createNewEnvNoEnterprise(ctx, "repos/o/r/environments/e", input)
+	if err != nil {
+		t.Errorf("Repositories.createNewEnvNoEnterprise returned error: %v", err)
+	}
+
+	want := &Environment{
+		ID:   Int64(1),
+		Name: String("staging"),
+		ProtectionRules: []*ProtectionRule{
+			{
+				ID:     Int64(1),
+				NodeID: String("id"),
+				Type:   String("branch_policy"),
+			},
+		},
+		DeploymentBranchPolicy: &BranchPolicy{
+			ProtectedBranches:    Bool(true),
+			CustomBranchPolicies: Bool(false),
+		},
+	}
+	if !cmp.Equal(release, want) {
+		t.Errorf("Repositories.createNewEnvNoEnterprise returned %+v, want %+v", release, want)
+	}
+
+	const methodName = "createNewEnvNoEnterprise"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.createNewEnvNoEnterprise(ctx, "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.createNewEnvNoEnterprise(ctx, "repos/o/r/environments/e", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
 func TestRepositoriesService_DeleteEnvironment(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
diff --git a/github/repos_forks.go b/github/repos_forks.go
index 5c7d5db..f175dfe 100644
--- a/github/repos_forks.go
+++ b/github/repos_forks.go
@@ -7,9 +7,8 @@ package github
 
 import (
 	"context"
-	"fmt"
-
 	"encoding/json"
+	"fmt"
 )
 
 // RepositoryListForksOptions specifies the optional parameters to the
@@ -53,9 +52,9 @@ func (s *RepositoriesService) ListForks(ctx context.Context, owner, repo string,
 // RepositoriesService.CreateFork method.
 type RepositoryCreateForkOptions struct {
 	// The organization to fork the repository into.
-	Organization      string `url:"organization,omitempty"`
-	Name              string `url:"name,omitempty"`
-	DefaultBranchOnly bool   `url:"default_branch_only,omitempty"`
+	Organization      string `json:"organization,omitempty"`
+	Name              string `json:"name,omitempty"`
+	DefaultBranchOnly bool   `json:"default_branch_only,omitempty"`
 }
 
 // CreateFork creates a fork of the specified repository.
@@ -70,12 +69,8 @@ type RepositoryCreateForkOptions struct {
 // GitHub API docs: https://docs.github.com/en/rest/repos/forks#create-a-fork
 func (s *RepositoriesService) CreateFork(ctx context.Context, owner, repo string, opts *RepositoryCreateForkOptions) (*Repository, *Response, error) {
 	u := fmt.Sprintf("repos/%v/%v/forks", owner, repo)
-	u, err := addOptions(u, opts)
-	if err != nil {
-		return nil, nil, err
-	}
 
-	req, err := s.client.NewRequest("POST", u, nil)
+	req, err := s.client.NewRequest("POST", u, opts)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/github/repos_forks_test.go b/github/repos_forks_test.go
index 07be423..d1a17f6 100644
--- a/github/repos_forks_test.go
+++ b/github/repos_forks_test.go
@@ -73,7 +73,7 @@ func TestRepositoriesService_CreateFork(t *testing.T) {
 
 	mux.HandleFunc("/repos/o/r/forks", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, "POST")
-		testFormValues(t, r, values{"organization": "o", "name": "n", "default_branch_only": "true"})
+		testBody(t, r, `{"organization":"o","name":"n","default_branch_only":true}`+"\n")
 		fmt.Fprint(w, `{"id":1}`)
 	})
 
@@ -110,7 +110,7 @@ func TestRepositoriesService_CreateFork_deferred(t *testing.T) {
 
 	mux.HandleFunc("/repos/o/r/forks", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, "POST")
-		testFormValues(t, r, values{"organization": "o", "name": "n", "default_branch_only": "true"})
+		testBody(t, r, `{"organization":"o","name":"n","default_branch_only":true}`+"\n")
 		// This response indicates the fork will happen asynchronously.
 		w.WriteHeader(http.StatusAccepted)
 		fmt.Fprint(w, `{"id":1}`)
diff --git a/github/repos_hooks.go b/github/repos_hooks.go
index 44eac8a..ba229e7 100644
--- a/github/repos_hooks.go
+++ b/github/repos_hooks.go
@@ -11,7 +11,6 @@ import (
 	"net/http"
 	"net/url"
 	"strings"
-	"time"
 )
 
 // WebHookPayload represents the data that is received from GitHub when a push
@@ -40,8 +39,8 @@ type WebHookAuthor = CommitAuthor
 
 // Hook represents a GitHub (web and service) hook for a repository.
 type Hook struct {
-	CreatedAt    *time.Time             `json:"created_at,omitempty"`
-	UpdatedAt    *time.Time             `json:"updated_at,omitempty"`
+	CreatedAt    *Timestamp             `json:"created_at,omitempty"`
+	UpdatedAt    *Timestamp             `json:"updated_at,omitempty"`
 	URL          *string                `json:"url,omitempty"`
 	ID           *int64                 `json:"id,omitempty"`
 	Type         *string                `json:"type,omitempty"`
diff --git a/github/repos_hooks_deliveries_test.go b/github/repos_hooks_deliveries_test.go
index 44b0f89..ef45399 100644
--- a/github/repos_hooks_deliveries_test.go
+++ b/github/repos_hooks_deliveries_test.go
@@ -153,6 +153,7 @@ var hookDeliveryPayloadTypeToStruct = map[string]interface{}{
 	"deploy_key":                     &DeployKeyEvent{},
 	"deployment":                     &DeploymentEvent{},
 	"deployment_status":              &DeploymentStatusEvent{},
+	"discussion_comment":             &DiscussionCommentEvent{},
 	"discussion":                     &DiscussionEvent{},
 	"fork":                           &ForkEvent{},
 	"github_app_authorization":       &GitHubAppAuthorizationEvent{},
diff --git a/github/repos_hooks_test.go b/github/repos_hooks_test.go
index 3c6ee6f..82e8b55 100644
--- a/github/repos_hooks_test.go
+++ b/github/repos_hooks_test.go
@@ -19,7 +19,7 @@ func TestRepositoriesService_CreateHook(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
-	input := &Hook{CreatedAt: &referenceTime}
+	input := &Hook{CreatedAt: &Timestamp{referenceTime}}
 
 	mux.HandleFunc("/repos/o/r/hooks", func(w http.ResponseWriter, r *http.Request) {
 		v := new(createHookRequest)
@@ -525,8 +525,8 @@ func TestBranchHook_Marshal(t *testing.T) {
 	testJSONMarshal(t, &Hook{}, "{}")
 
 	v := &Hook{
-		CreatedAt: &referenceTime,
-		UpdatedAt: &referenceTime,
+		CreatedAt: &Timestamp{referenceTime},
+		UpdatedAt: &Timestamp{referenceTime},
 		URL:       String("url"),
 		ID:        Int64(1),
 		Type:      String("type"),
diff --git a/github/repos_pages.go b/github/repos_pages.go
index 737cec0..83075db 100644
--- a/github/repos_pages.go
+++ b/github/repos_pages.go
@@ -17,6 +17,7 @@ type Pages struct {
 	CNAME            *string                `json:"cname,omitempty"`
 	Custom404        *bool                  `json:"custom_404,omitempty"`
 	HTMLURL          *string                `json:"html_url,omitempty"`
+	BuildType        *string                `json:"build_type,omitempty"`
 	Source           *PagesSource           `json:"source,omitempty"`
 	Public           *bool                  `json:"public,omitempty"`
 	HTTPSCertificate *PagesHTTPSCertificate `json:"https_certificate,omitempty"`
@@ -46,6 +47,44 @@ type PagesBuild struct {
 	UpdatedAt *Timestamp  `json:"updated_at,omitempty"`
 }
 
+// PagesDomain represents a domain associated with a GitHub Pages site.
+type PagesDomain struct {
+	Host                          *string `json:"host,omitempty"`
+	URI                           *string `json:"uri,omitempty"`
+	Nameservers                   *string `json:"nameservers,omitempty"`
+	DNSResolves                   *bool   `json:"dns_resolves,omitempty"`
+	IsProxied                     *bool   `json:"is_proxied,omitempty"`
+	IsCloudflareIP                *bool   `json:"is_cloudflare_ip,omitempty"`
+	IsFastlyIP                    *bool   `json:"is_fastly_ip,omitempty"`
+	IsOldIPAddress                *bool   `json:"is_old_ip_address,omitempty"`
+	IsARecord                     *bool   `json:"is_a_record,omitempty"`
+	HasCNAMERecord                *bool   `json:"has_cname_record,omitempty"`
+	HasMXRecordsPresent           *bool   `json:"has_mx_records_present,omitempty"`
+	IsValidDomain                 *bool   `json:"is_valid_domain,omitempty"`
+	IsApexDomain                  *bool   `json:"is_apex_domain,omitempty"`
+	ShouldBeARecord               *bool   `json:"should_be_a_record,omitempty"`
+	IsCNAMEToGithubUserDomain     *bool   `json:"is_cname_to_github_user_domain,omitempty"`
+	IsCNAMEToPagesDotGithubDotCom *bool   `json:"is_cname_to_pages_dot_github_dot_com,omitempty"`
+	IsCNAMEToFastly               *bool   `json:"is_cname_to_fastly,omitempty"`
+	IsPointedToGithubPagesIP      *bool   `json:"is_pointed_to_github_pages_ip,omitempty"`
+	IsNonGithubPagesIPPresent     *bool   `json:"is_non_github_pages_ip_present,omitempty"`
+	IsPagesDomain                 *bool   `json:"is_pages_domain,omitempty"`
+	IsServedByPages               *bool   `json:"is_served_by_pages,omitempty"`
+	IsValid                       *bool   `json:"is_valid,omitempty"`
+	Reason                        *string `json:"reason,omitempty"`
+	RespondsToHTTPS               *bool   `json:"responds_to_https,omitempty"`
+	EnforcesHTTPS                 *bool   `json:"enforces_https,omitempty"`
+	HTTPSError                    *string `json:"https_error,omitempty"`
+	IsHTTPSEligible               *bool   `json:"is_https_eligible,omitempty"`
+	CAAError                      *string `json:"caa_error,omitempty"`
+}
+
+// PagesHealthCheckResponse represents the response given for the health check of a GitHub Pages site.
+type PagesHealthCheckResponse struct {
+	Domain    *PagesDomain `json:"domain,omitempty"`
+	AltDomain *PagesDomain `json:"alt_domain,omitempty"`
+}
+
 // PagesHTTPSCertificate represents the HTTPS Certificate information for a GitHub Pages site.
 type PagesHTTPSCertificate struct {
 	State       *string  `json:"state,omitempty"`
@@ -58,7 +97,8 @@ type PagesHTTPSCertificate struct {
 // createPagesRequest is a subset of Pages and is used internally
 // by EnablePages to pass only the known fields for the endpoint.
 type createPagesRequest struct {
-	Source *PagesSource `json:"source,omitempty"`
+	BuildType *string      `json:"build_type,omitempty"`
+	Source    *PagesSource `json:"source,omitempty"`
 }
 
 // EnablePages enables GitHub Pages for the named repo.
@@ -68,7 +108,8 @@ func (s *RepositoriesService) EnablePages(ctx context.Context, owner, repo strin
 	u := fmt.Sprintf("repos/%v/%v/pages", owner, repo)
 
 	pagesReq := &createPagesRequest{
-		Source: pages.Source,
+		BuildType: pages.BuildType,
+		Source:    pages.Source,
 	}
 
 	req, err := s.client.NewRequest("POST", u, pagesReq)
@@ -92,6 +133,10 @@ type PagesUpdate struct {
 	// CNAME represents a custom domain for the repository.
 	// Leaving CNAME empty will remove the custom domain.
 	CNAME *string `json:"cname"`
+	// BuildType is optional and can either be "legacy" or "workflow".
+	// "workflow" - You are using a github workflow to build your pages.
+	// "legacy"   - You are deploying from a branch.
+	BuildType *string `json:"build_type,omitempty"`
 	// Source must include the branch name, and may optionally specify the subdirectory "/docs".
 	// Possible values for Source.Branch are usually "gh-pages", "main", and "master",
 	// or any other existing branch name.
@@ -240,3 +285,22 @@ func (s *RepositoriesService) RequestPageBuild(ctx context.Context, owner, repo
 
 	return build, resp, nil
 }
+
+// GetPagesHealthCheck gets a DNS health check for the CNAME record configured for a repository's GitHub Pages.
+//
+// GitHub API docs: https://docs.github.com/en/rest/pages#get-a-dns-health-check-for-github-pages
+func (s *RepositoriesService) GetPageHealthCheck(ctx context.Context, owner, repo string) (*PagesHealthCheckResponse, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/pages/health", owner, repo)
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	healthCheckResponse := new(PagesHealthCheckResponse)
+	resp, err := s.client.Do(ctx, req, healthCheckResponse)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return healthCheckResponse, resp, nil
+}
diff --git a/github/repos_pages_test.go b/github/repos_pages_test.go
index 75d6ccb..21ffb18 100644
--- a/github/repos_pages_test.go
+++ b/github/repos_pages_test.go
@@ -17,11 +17,12 @@ import (
 	"github.com/google/go-cmp/cmp"
 )
 
-func TestRepositoriesService_EnablePages(t *testing.T) {
+func TestRepositoriesService_EnablePagesLegacy(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
 	input := &Pages{
+		BuildType: String("legacy"),
 		Source: &PagesSource{
 			Branch: String("master"),
 			Path:   String("/"),
@@ -35,12 +36,12 @@ func TestRepositoriesService_EnablePages(t *testing.T) {
 
 		testMethod(t, r, "POST")
 		testHeader(t, r, "Accept", mediaTypeEnablePagesAPIPreview)
-		want := &createPagesRequest{Source: &PagesSource{Branch: String("master"), Path: String("/")}}
+		want := &createPagesRequest{BuildType: String("legacy"), Source: &PagesSource{Branch: String("master"), Path: String("/")}}
 		if !cmp.Equal(v, want) {
 			t.Errorf("Request body = %+v, want %+v", v, want)
 		}
 
-		fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false,"html_url":"h", "source": {"branch":"master", "path":"/"}}`)
+		fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false,"html_url":"h","build_type": "legacy","source": {"branch":"master", "path":"/"}}`)
 	})
 
 	ctx := context.Background()
@@ -49,7 +50,7 @@ func TestRepositoriesService_EnablePages(t *testing.T) {
 		t.Errorf("Repositories.EnablePages returned error: %v", err)
 	}
 
-	want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false), HTMLURL: String("h"), Source: &PagesSource{Branch: String("master"), Path: String("/")}}
+	want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false), HTMLURL: String("h"), BuildType: String("legacy"), Source: &PagesSource{Branch: String("master"), Path: String("/")}}
 
 	if !cmp.Equal(page, want) {
 		t.Errorf("Repositories.EnablePages returned %v, want %v", page, want)
@@ -70,13 +71,64 @@ func TestRepositoriesService_EnablePages(t *testing.T) {
 	})
 }
 
-func TestRepositoriesService_UpdatePages(t *testing.T) {
+func TestRepositoriesService_EnablePagesWorkflow(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	input := &Pages{
+		BuildType: String("workflow"),
+		CNAME:     String("www.my-domain.com"), // not passed along.
+	}
+
+	mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) {
+		v := new(createPagesRequest)
+		json.NewDecoder(r.Body).Decode(v)
+
+		testMethod(t, r, "POST")
+		testHeader(t, r, "Accept", mediaTypeEnablePagesAPIPreview)
+		want := &createPagesRequest{BuildType: String("workflow")}
+		if !cmp.Equal(v, want) {
+			t.Errorf("Request body = %+v, want %+v", v, want)
+		}
+
+		fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false,"html_url":"h","build_type": "workflow"}`)
+	})
+
+	ctx := context.Background()
+	page, _, err := client.Repositories.EnablePages(ctx, "o", "r", input)
+	if err != nil {
+		t.Errorf("Repositories.EnablePages returned error: %v", err)
+	}
+
+	want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false), HTMLURL: String("h"), BuildType: String("workflow")}
+
+	if !cmp.Equal(page, want) {
+		t.Errorf("Repositories.EnablePages returned %v, want %v", page, want)
+	}
+
+	const methodName = "EnablePages"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.EnablePages(ctx, "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.EnablePages(ctx, "o", "r", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_UpdatePagesLegacy(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
 	input := &PagesUpdate{
-		CNAME:  String("www.my-domain.com"),
-		Source: &PagesSource{Branch: String("gh-pages")},
+		CNAME:     String("www.my-domain.com"),
+		BuildType: String("legacy"),
+		Source:    &PagesSource{Branch: String("gh-pages")},
 	}
 
 	mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) {
@@ -84,12 +136,51 @@ func TestRepositoriesService_UpdatePages(t *testing.T) {
 		json.NewDecoder(r.Body).Decode(v)
 
 		testMethod(t, r, "PUT")
-		want := &PagesUpdate{CNAME: String("www.my-domain.com"), Source: &PagesSource{Branch: String("gh-pages")}}
+		want := &PagesUpdate{CNAME: String("www.my-domain.com"), BuildType: String("legacy"), Source: &PagesSource{Branch: String("gh-pages")}}
 		if !cmp.Equal(v, want) {
 			t.Errorf("Request body = %+v, want %+v", v, want)
 		}
 
-		fmt.Fprint(w, `{"cname":"www.my-domain.com","source":{"branch":"gh-pages"}}`)
+		fmt.Fprint(w, `{"cname":"www.my-domain.com","build_type":"legacy","source":{"branch":"gh-pages"}}`)
+	})
+
+	ctx := context.Background()
+	_, err := client.Repositories.UpdatePages(ctx, "o", "r", input)
+	if err != nil {
+		t.Errorf("Repositories.UpdatePages returned error: %v", err)
+	}
+
+	const methodName = "UpdatePages"
+	testBadOptions(t, methodName, func() (err error) {
+		_, err = client.Repositories.UpdatePages(ctx, "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		return client.Repositories.UpdatePages(ctx, "o", "r", input)
+	})
+}
+
+func TestRepositoriesService_UpdatePagesWorkflow(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	input := &PagesUpdate{
+		CNAME:     String("www.my-domain.com"),
+		BuildType: String("workflow"),
+	}
+
+	mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) {
+		v := new(PagesUpdate)
+		json.NewDecoder(r.Body).Decode(v)
+
+		testMethod(t, r, "PUT")
+		want := &PagesUpdate{CNAME: String("www.my-domain.com"), BuildType: String("workflow")}
+		if !cmp.Equal(v, want) {
+			t.Errorf("Request body = %+v, want %+v", v, want)
+		}
+
+		fmt.Fprint(w, `{"cname":"www.my-domain.com","build_type":"workflow"}`)
 	})
 
 	ctx := context.Background()
@@ -358,6 +449,54 @@ func TestRepositoriesService_RequestPageBuild(t *testing.T) {
 	})
 }
 
+func TestRepositoriesService_GetPageHealthCheck(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/pages/health", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{"domain":{"host":"example.com","uri":"http://example.com/","nameservers":"default","dns_resolves":true},"alt_domain":{"host":"www.example.com","uri":"http://www.example.com/","nameservers":"default","dns_resolves":true}}`)
+	})
+
+	ctx := context.Background()
+	healthCheckResponse, _, err := client.Repositories.GetPageHealthCheck(ctx, "o", "r")
+	if err != nil {
+		t.Errorf("Repositories.GetPageHealthCheck returned error: %v", err)
+	}
+
+	want := &PagesHealthCheckResponse{
+		Domain: &PagesDomain{
+			Host:        String("example.com"),
+			URI:         String("http://example.com/"),
+			Nameservers: String("default"),
+			DNSResolves: Bool(true),
+		},
+		AltDomain: &PagesDomain{
+			Host:        String("www.example.com"),
+			URI:         String("http://www.example.com/"),
+			Nameservers: String("default"),
+			DNSResolves: Bool(true),
+		},
+	}
+	if !cmp.Equal(healthCheckResponse, want) {
+		t.Errorf("Repositories.GetPageHealthCheck returned %+v, want %+v", healthCheckResponse, want)
+	}
+
+	const methodName = "GetPageHealthCheck"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.GetPageHealthCheck(ctx, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.GetPageHealthCheck(ctx, "o", "r")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
 func TestPagesSource_Marshal(t *testing.T) {
 	testJSONMarshal(t, &PagesSource{}, "{}")
 
@@ -468,6 +607,90 @@ func TestPagesBuild_Marshal(t *testing.T) {
 	testJSONMarshal(t, u, want)
 }
 
+func TestPagesHealthCheckResponse_Marshal(t *testing.T) {
+	testJSONMarshal(t, &PagesHealthCheckResponse{}, "{}")
+
+	u := &PagesHealthCheckResponse{
+		Domain: &PagesDomain{
+			Host:                          String("example.com"),
+			URI:                           String("http://example.com/"),
+			Nameservers:                   String("default"),
+			DNSResolves:                   Bool(true),
+			IsProxied:                     Bool(false),
+			IsCloudflareIP:                Bool(false),
+			IsFastlyIP:                    Bool(false),
+			IsOldIPAddress:                Bool(false),
+			IsARecord:                     Bool(true),
+			HasCNAMERecord:                Bool(false),
+			HasMXRecordsPresent:           Bool(false),
+			IsValidDomain:                 Bool(true),
+			IsApexDomain:                  Bool(true),
+			ShouldBeARecord:               Bool(true),
+			IsCNAMEToGithubUserDomain:     Bool(false),
+			IsCNAMEToPagesDotGithubDotCom: Bool(false),
+			IsCNAMEToFastly:               Bool(false),
+			IsPointedToGithubPagesIP:      Bool(true),
+			IsNonGithubPagesIPPresent:     Bool(false),
+			IsPagesDomain:                 Bool(false),
+			IsServedByPages:               Bool(true),
+			IsValid:                       Bool(true),
+			Reason:                        String("some reason"),
+			RespondsToHTTPS:               Bool(true),
+			EnforcesHTTPS:                 Bool(true),
+			HTTPSError:                    String("some error"),
+			IsHTTPSEligible:               Bool(true),
+			CAAError:                      String("some error"),
+		},
+		AltDomain: &PagesDomain{
+			Host:        String("www.example.com"),
+			URI:         String("http://www.example.com/"),
+			Nameservers: String("default"),
+			DNSResolves: Bool(true),
+		},
+	}
+
+	want := `{
+		"domain": {
+		  "host": "example.com",
+		  "uri": "http://example.com/",
+		  "nameservers": "default",
+		  "dns_resolves": true,
+		  "is_proxied": false,
+		  "is_cloudflare_ip": false,
+		  "is_fastly_ip": false,
+		  "is_old_ip_address": false,
+		  "is_a_record": true,
+		  "has_cname_record": false,
+		  "has_mx_records_present": false,
+		  "is_valid_domain": true,
+		  "is_apex_domain": true,
+		  "should_be_a_record": true,
+		  "is_cname_to_github_user_domain": false,
+		  "is_cname_to_pages_dot_github_dot_com": false,
+		  "is_cname_to_fastly": false,
+		  "is_pointed_to_github_pages_ip": true,
+		  "is_non_github_pages_ip_present": false,
+		  "is_pages_domain": false,
+		  "is_served_by_pages": true,
+		  "is_valid": true,
+		  "reason": "some reason",
+		  "responds_to_https": true,
+		  "enforces_https": true,
+		  "https_error": "some error",
+		  "is_https_eligible": true,
+		  "caa_error": "some error"
+		},
+		"alt_domain": {
+		  "host": "www.example.com",
+		  "uri": "http://www.example.com/",
+		  "nameservers": "default",
+		  "dns_resolves": true
+		}
+	  }`
+
+	testJSONMarshal(t, u, want)
+}
+
 func TestCreatePagesRequest_Marshal(t *testing.T) {
 	testJSONMarshal(t, &createPagesRequest{}, "{}")
 
diff --git a/github/repos_releases.go b/github/repos_releases.go
index c030f04..464c2ee 100644
--- a/github/repos_releases.go
+++ b/github/repos_releases.go
@@ -19,12 +19,14 @@ import (
 
 // RepositoryRelease represents a GitHub release in a repository.
 type RepositoryRelease struct {
-	TagName                *string `json:"tag_name,omitempty"`
-	TargetCommitish        *string `json:"target_commitish,omitempty"`
-	Name                   *string `json:"name,omitempty"`
-	Body                   *string `json:"body,omitempty"`
-	Draft                  *bool   `json:"draft,omitempty"`
-	Prerelease             *bool   `json:"prerelease,omitempty"`
+	TagName         *string `json:"tag_name,omitempty"`
+	TargetCommitish *string `json:"target_commitish,omitempty"`
+	Name            *string `json:"name,omitempty"`
+	Body            *string `json:"body,omitempty"`
+	Draft           *bool   `json:"draft,omitempty"`
+	Prerelease      *bool   `json:"prerelease,omitempty"`
+	// MakeLatest can be one of: "true", "false", or "legacy".
+	MakeLatest             *string `json:"make_latest,omitempty"`
 	DiscussionCategoryName *string `json:"discussion_category_name,omitempty"`
 
 	// The following fields are not used in EditRelease:
@@ -176,6 +178,7 @@ type repositoryReleaseRequest struct {
 	Body                   *string `json:"body,omitempty"`
 	Draft                  *bool   `json:"draft,omitempty"`
 	Prerelease             *bool   `json:"prerelease,omitempty"`
+	MakeLatest             *string `json:"make_latest,omitempty"`
 	GenerateReleaseNotes   *bool   `json:"generate_release_notes,omitempty"`
 	DiscussionCategoryName *string `json:"discussion_category_name,omitempty"`
 }
@@ -196,6 +199,7 @@ func (s *RepositoriesService) CreateRelease(ctx context.Context, owner, repo str
 		Body:                   release.Body,
 		Draft:                  release.Draft,
 		Prerelease:             release.Prerelease,
+		MakeLatest:             release.MakeLatest,
 		DiscussionCategoryName: release.DiscussionCategoryName,
 		GenerateReleaseNotes:   release.GenerateReleaseNotes,
 	}
@@ -229,6 +233,7 @@ func (s *RepositoriesService) EditRelease(ctx context.Context, owner, repo strin
 		Body:                   release.Body,
 		Draft:                  release.Draft,
 		Prerelease:             release.Prerelease,
+		MakeLatest:             release.MakeLatest,
 		DiscussionCategoryName: release.DiscussionCategoryName,
 	}
 
diff --git a/github/repos_releases_test.go b/github/repos_releases_test.go
index 77a20ff..73a9f3a 100644
--- a/github/repos_releases_test.go
+++ b/github/repos_releases_test.go
@@ -708,6 +708,7 @@ func TestRepositoryReleaseRequest_Marshal(t *testing.T) {
 		Body:                   String("body"),
 		Draft:                  Bool(false),
 		Prerelease:             Bool(false),
+		MakeLatest:             String("legacy"),
 		DiscussionCategoryName: String("dcn"),
 	}
 
@@ -718,6 +719,7 @@ func TestRepositoryReleaseRequest_Marshal(t *testing.T) {
 		"body": "body",
 		"draft": false,
 		"prerelease": false,
+		"make_latest": "legacy",
 		"discussion_category_name": "dcn"
 	}`
 
@@ -774,6 +776,7 @@ func TestRepositoryRelease_Marshal(t *testing.T) {
 		Body:                   String("body"),
 		Draft:                  Bool(false),
 		Prerelease:             Bool(false),
+		MakeLatest:             String("legacy"),
 		DiscussionCategoryName: String("dcn"),
 		ID:                     Int64(1),
 		CreatedAt:              &Timestamp{referenceTime},
@@ -796,6 +799,7 @@ func TestRepositoryRelease_Marshal(t *testing.T) {
 		"body": "body",
 		"draft": false,
 		"prerelease": false,
+		"make_latest": "legacy",
 		"discussion_category_name": "dcn",
 		"id": 1,
 		"created_at": ` + referenceTimeStr + `,
diff --git a/github/repos_statuses.go b/github/repos_statuses.go
index 42238f3..ea3d166 100644
--- a/github/repos_statuses.go
+++ b/github/repos_statuses.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // RepoStatus represents the status of a repository at a particular reference.
@@ -35,8 +34,8 @@ type RepoStatus struct {
 	AvatarURL *string `json:"avatar_url,omitempty"`
 
 	Creator   *User      `json:"creator,omitempty"`
-	CreatedAt *time.Time `json:"created_at,omitempty"`
-	UpdatedAt *time.Time `json:"updated_at,omitempty"`
+	CreatedAt *Timestamp `json:"created_at,omitempty"`
+	UpdatedAt *Timestamp `json:"updated_at,omitempty"`
 }
 
 func (r RepoStatus) String() string {
diff --git a/github/repos_statuses_test.go b/github/repos_statuses_test.go
index 62fe333..c9e03ac 100644
--- a/github/repos_statuses_test.go
+++ b/github/repos_statuses_test.go
@@ -163,8 +163,8 @@ func TestRepoStatus_Marshal(t *testing.T) {
 		Context:     String("ctx"),
 		AvatarURL:   String("aurl"),
 		Creator:     &User{ID: Int64(1)},
-		CreatedAt:   &referenceTime,
-		UpdatedAt:   &referenceTime,
+		CreatedAt:   &Timestamp{referenceTime},
+		UpdatedAt:   &Timestamp{referenceTime},
 	}
 
 	want := `{
@@ -205,8 +205,8 @@ func TestCombinedStatus_Marshal(t *testing.T) {
 				Context:     String("ctx"),
 				AvatarURL:   String("aurl"),
 				Creator:     &User{ID: Int64(1)},
-				CreatedAt:   &referenceTime,
-				UpdatedAt:   &referenceTime,
+				CreatedAt:   &Timestamp{referenceTime},
+				UpdatedAt:   &Timestamp{referenceTime},
 			},
 		},
 		CommitURL:     String("curl"),
diff --git a/github/repos_test.go b/github/repos_test.go
index bcaa7d3..e86d807 100644
--- a/github/repos_test.go
+++ b/github/repos_test.go
@@ -1082,6 +1082,7 @@ func TestRepositoriesService_GetBranchProtection(t *testing.T) {
 					},
 					"dismiss_stale_reviews":true,
 					"require_code_owner_reviews":true,
+					"require_last_push_approval":false,
 					"required_approving_review_count":1
 					},
 					"enforce_admins":{
@@ -1095,6 +1096,15 @@ func TestRepositoriesService_GetBranchProtection(t *testing.T) {
 					},
 					"required_conversation_resolution": {
 						"enabled": true
+					},
+					"block_creations": {
+						"enabled": false
+					},
+					"lock_branch": {
+						"enabled": false
+					},
+					"allow_fork_syncing": {
+						"enabled": false
 					}
 				}`)
 	})
@@ -1130,6 +1140,7 @@ func TestRepositoriesService_GetBranchProtection(t *testing.T) {
 			},
 			RequireCodeOwnerReviews:      true,
 			RequiredApprovingReviewCount: 1,
+			RequireLastPushApproval:      false,
 		},
 		EnforceAdmins: &AdminEnforcement{
 			URL:     String("/repos/o/r/branches/b/protection/enforce_admins"),
@@ -1149,6 +1160,15 @@ func TestRepositoriesService_GetBranchProtection(t *testing.T) {
 		RequiredConversationResolution: &RequiredConversationResolution{
 			Enabled: true,
 		},
+		BlockCreations: &BlockCreations{
+			Enabled: Bool(false),
+		},
+		LockBranch: &LockBranch{
+			Enabled: Bool(false),
+		},
+		AllowForkSyncing: &AllowForkSyncing{
+			Enabled: Bool(false),
+		},
 	}
 	if !cmp.Equal(protection, want) {
 		t.Errorf("Repositories.GetBranchProtection returned %+v, want %+v", protection, want)
@@ -1297,6 +1317,9 @@ func TestRepositoriesService_UpdateBranchProtection_Contexts(t *testing.T) {
 			Teams: []string{"t"},
 			Apps:  []string{"a"},
 		},
+		BlockCreations:   Bool(true),
+		LockBranch:       Bool(true),
+		AllowForkSyncing: Bool(true),
 	}
 
 	mux.HandleFunc("/repos/o/r/branches/b/protection", func(w http.ResponseWriter, r *http.Request) {
@@ -1348,6 +1371,15 @@ func TestRepositoriesService_UpdateBranchProtection_Contexts(t *testing.T) {
 				"users":[{"id":1,"login":"u"}],
 				"teams":[{"id":2,"slug":"t"}],
 				"apps":[{"id":3,"slug":"a"}]
+			},
+			"block_creations": {
+				"enabled": true
+			},
+			"lock_branch": {
+				"enabled": true
+			},
+			"allow_fork_syncing": {
+				"enabled": true
 			}
 		}`)
 	})
@@ -1405,6 +1437,15 @@ func TestRepositoriesService_UpdateBranchProtection_Contexts(t *testing.T) {
 				{Slug: String("a"), ID: Int64(3)},
 			},
 		},
+		BlockCreations: &BlockCreations{
+			Enabled: Bool(true),
+		},
+		LockBranch: &LockBranch{
+			Enabled: Bool(true),
+		},
+		AllowForkSyncing: &AllowForkSyncing{
+			Enabled: Bool(true),
+		},
 	}
 	if !cmp.Equal(protection, want) {
 		t.Errorf("Repositories.UpdateBranchProtection returned %+v, want %+v", protection, want)
@@ -1633,6 +1674,7 @@ func TestRepositoriesService_UpdateBranchProtection_StrictNoChecks(t *testing.T)
 				},
 				"dismiss_stale_reviews":true,
 				"require_code_owner_reviews":true,
+				"require_last_push_approval":false,
 				"bypass_pull_request_allowances": {
 					"users":[{"id":10,"login":"uuu"}],
 					"teams":[{"id":20,"slug":"ttt"}],
@@ -1702,6 +1744,48 @@ func TestRepositoriesService_UpdateBranchProtection_StrictNoChecks(t *testing.T)
 	}
 }
 
+func TestRepositoriesService_UpdateBranchProtection_RequireLastPushApproval(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	input := &ProtectionRequest{
+		RequiredPullRequestReviews: &PullRequestReviewsEnforcementRequest{
+			RequireLastPushApproval: Bool(true),
+		},
+	}
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection", func(w http.ResponseWriter, r *http.Request) {
+		v := new(ProtectionRequest)
+		json.NewDecoder(r.Body).Decode(v)
+
+		testMethod(t, r, "PUT")
+		if !cmp.Equal(v, input) {
+			t.Errorf("Request body = %+v, want %+v", v, input)
+		}
+
+		fmt.Fprintf(w, `{
+			"required_pull_request_reviews":{
+				"require_last_push_approval":true
+			}
+		}`)
+	})
+
+	ctx := context.Background()
+	protection, _, err := client.Repositories.UpdateBranchProtection(ctx, "o", "r", "b", input)
+	if err != nil {
+		t.Errorf("Repositories.UpdateBranchProtection returned error: %v", err)
+	}
+
+	want := &Protection{
+		RequiredPullRequestReviews: &PullRequestReviewsEnforcement{
+			RequireLastPushApproval: true,
+		},
+	}
+	if !cmp.Equal(protection, want) {
+		t.Errorf("Repositories.UpdateBranchProtection returned %+v, want %+v", protection, want)
+	}
+}
+
 func TestRepositoriesService_RemoveBranchProtection(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
@@ -2561,6 +2645,7 @@ func TestPullRequestReviewsEnforcementRequest_MarshalJSON_nilDismissalRestirctio
 			Teams: &[]string{},
 			Apps:  &[]string{},
 		},
+		RequireLastPushApproval: Bool(true),
 	}
 
 	got, err = json.Marshal(req)
@@ -2568,7 +2653,7 @@ func TestPullRequestReviewsEnforcementRequest_MarshalJSON_nilDismissalRestirctio
 		t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned error: %v", err)
 	}
 
-	want = `{"dismissal_restrictions":{"users":[],"teams":[],"apps":[]},"dismiss_stale_reviews":false,"require_code_owner_reviews":false,"required_approving_review_count":0}`
+	want = `{"dismissal_restrictions":{"users":[],"teams":[],"apps":[]},"dismiss_stale_reviews":false,"require_code_owner_reviews":false,"required_approving_review_count":0,"require_last_push_approval":true}`
 	if want != string(got) {
 		t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned %+v, want %+v", string(got), want)
 	}
@@ -2714,7 +2799,7 @@ func TestRepositoriesService_ReplaceAllTopics_emptySlice(t *testing.T) {
 	}
 }
 
-func TestRepositoriesService_ListApps(t *testing.T) {
+func TestRepositoriesService_ListAppRestrictions(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
@@ -2723,19 +2808,19 @@ func TestRepositoriesService_ListApps(t *testing.T) {
 	})
 
 	ctx := context.Background()
-	_, _, err := client.Repositories.ListApps(ctx, "o", "r", "b")
+	_, _, err := client.Repositories.ListAppRestrictions(ctx, "o", "r", "b")
 	if err != nil {
-		t.Errorf("Repositories.ListApps returned error: %v", err)
+		t.Errorf("Repositories.ListAppRestrictions returned error: %v", err)
 	}
 
-	const methodName = "ListApps"
+	const methodName = "ListAppRestrictions"
 	testBadOptions(t, methodName, func() (err error) {
-		_, _, err = client.Repositories.ListApps(ctx, "\n", "\n", "\n")
+		_, _, err = client.Repositories.ListAppRestrictions(ctx, "\n", "\n", "\n")
 		return err
 	})
 
 	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
-		got, resp, err := client.Repositories.ListApps(ctx, "o", "r", "b")
+		got, resp, err := client.Repositories.ListAppRestrictions(ctx, "o", "r", "b")
 		if got != nil {
 			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
 		}
@@ -2853,6 +2938,284 @@ func TestRepositoriesService_RemoveAppRestrictions(t *testing.T) {
 	})
 }
 
+func TestRepositoriesService_ListTeamRestrictions(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/teams", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+	})
+
+	ctx := context.Background()
+	_, _, err := client.Repositories.ListTeamRestrictions(ctx, "o", "r", "b")
+	if err != nil {
+		t.Errorf("Repositories.ListTeamRestrictions returned error: %v", err)
+	}
+
+	const methodName = "ListTeamRestrictions"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.ListTeamRestrictions(ctx, "\n", "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.ListTeamRestrictions(ctx, "o", "r", "b")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_ReplaceTeamRestrictions(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/teams", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		fmt.Fprint(w, `[{
+				"name": "octocat"
+			}]`)
+	})
+	input := []string{"octocat"}
+	ctx := context.Background()
+	got, _, err := client.Repositories.ReplaceTeamRestrictions(ctx, "o", "r", "b", input)
+	if err != nil {
+		t.Errorf("Repositories.ReplaceTeamRestrictions returned error: %v", err)
+	}
+	want := []*Team{
+		{Name: String("octocat")},
+	}
+	if !cmp.Equal(got, want) {
+		t.Errorf("Repositories.ReplaceTeamRestrictions returned %+v, want %+v", got, want)
+	}
+
+	const methodName = "ReplaceTeamRestrictions"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.ReplaceTeamRestrictions(ctx, "\n", "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.ReplaceTeamRestrictions(ctx, "o", "r", "b", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_AddTeamRestrictions(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/teams", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "POST")
+		fmt.Fprint(w, `[{
+				"name": "octocat"
+			}]`)
+	})
+	input := []string{"octocat"}
+	ctx := context.Background()
+	got, _, err := client.Repositories.AddTeamRestrictions(ctx, "o", "r", "b", input)
+	if err != nil {
+		t.Errorf("Repositories.AddTeamRestrictions returned error: %v", err)
+	}
+	want := []*Team{
+		{Name: String("octocat")},
+	}
+	if !cmp.Equal(got, want) {
+		t.Errorf("Repositories.AddTeamRestrictions returned %+v, want %+v", got, want)
+	}
+
+	const methodName = "AddTeamRestrictions"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.AddTeamRestrictions(ctx, "\n", "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.AddTeamRestrictions(ctx, "o", "r", "b", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_RemoveTeamRestrictions(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/teams", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+		fmt.Fprint(w, `[]`)
+	})
+	input := []string{"octocat"}
+	ctx := context.Background()
+	got, _, err := client.Repositories.RemoveTeamRestrictions(ctx, "o", "r", "b", input)
+	if err != nil {
+		t.Errorf("Repositories.RemoveTeamRestrictions returned error: %v", err)
+	}
+	want := []*Team{}
+	if !cmp.Equal(got, want) {
+		t.Errorf("Repositories.RemoveTeamRestrictions returned %+v, want %+v", got, want)
+	}
+
+	const methodName = "RemoveTeamRestrictions"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.RemoveTeamRestrictions(ctx, "\n", "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.RemoveTeamRestrictions(ctx, "o", "r", "b", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_ListUserRestrictions(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/users", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+	})
+
+	ctx := context.Background()
+	_, _, err := client.Repositories.ListUserRestrictions(ctx, "o", "r", "b")
+	if err != nil {
+		t.Errorf("Repositories.ListUserRestrictions returned error: %v", err)
+	}
+
+	const methodName = "ListUserRestrictions"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.ListUserRestrictions(ctx, "\n", "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.ListUserRestrictions(ctx, "o", "r", "b")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_ReplaceUserRestrictions(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/users", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "PUT")
+		fmt.Fprint(w, `[{
+				"name": "octocat"
+			}]`)
+	})
+	input := []string{"octocat"}
+	ctx := context.Background()
+	got, _, err := client.Repositories.ReplaceUserRestrictions(ctx, "o", "r", "b", input)
+	if err != nil {
+		t.Errorf("Repositories.ReplaceUserRestrictions returned error: %v", err)
+	}
+	want := []*User{
+		{Name: String("octocat")},
+	}
+	if !cmp.Equal(got, want) {
+		t.Errorf("Repositories.ReplaceUserRestrictions returned %+v, want %+v", got, want)
+	}
+
+	const methodName = "ReplaceUserRestrictions"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.ReplaceUserRestrictions(ctx, "\n", "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.ReplaceUserRestrictions(ctx, "o", "r", "b", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_AddUserRestrictions(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/users", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "POST")
+		fmt.Fprint(w, `[{
+				"name": "octocat"
+			}]`)
+	})
+	input := []string{"octocat"}
+	ctx := context.Background()
+	got, _, err := client.Repositories.AddUserRestrictions(ctx, "o", "r", "b", input)
+	if err != nil {
+		t.Errorf("Repositories.AddUserRestrictions returned error: %v", err)
+	}
+	want := []*User{
+		{Name: String("octocat")},
+	}
+	if !cmp.Equal(got, want) {
+		t.Errorf("Repositories.AddUserRestrictions returned %+v, want %+v", got, want)
+	}
+
+	const methodName = "AddUserRestrictions"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.AddUserRestrictions(ctx, "\n", "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.AddUserRestrictions(ctx, "o", "r", "b", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestRepositoriesService_RemoveUserRestrictions(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/users", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "DELETE")
+		fmt.Fprint(w, `[]`)
+	})
+	input := []string{"octocat"}
+	ctx := context.Background()
+	got, _, err := client.Repositories.RemoveUserRestrictions(ctx, "o", "r", "b", input)
+	if err != nil {
+		t.Errorf("Repositories.RemoveUserRestrictions returned error: %v", err)
+	}
+	want := []*User{}
+	if !cmp.Equal(got, want) {
+		t.Errorf("Repositories.RemoveUserRestrictions returned %+v, want %+v", got, want)
+	}
+
+	const methodName = "RemoveUserRestrictions"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Repositories.RemoveUserRestrictions(ctx, "\n", "\n", "\n", input)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Repositories.RemoveUserRestrictions(ctx, "o", "r", "b", input)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
 func TestRepositoriesService_Transfer(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
diff --git a/github/scim.go b/github/scim.go
index 70f81ed..7deee6b 100644
--- a/github/scim.go
+++ b/github/scim.go
@@ -69,14 +69,14 @@ type SCIMProvisionedIdentities struct {
 //
 // Github API docs: https://docs.github.com/en/rest/scim#list-scim-provisioned-identities--parameters
 type ListSCIMProvisionedIdentitiesOptions struct {
-	StartIndex *int `json:"startIndex,omitempty"` // Used for pagination: the index of the first result to return. (Optional.)
-	Count      *int `json:"count,omitempty"`      // Used for pagination: the number of results to return. (Optional.)
+	StartIndex *int `url:"startIndex,omitempty"` // Used for pagination: the index of the first result to return. (Optional.)
+	Count      *int `url:"count,omitempty"`      // Used for pagination: the number of results to return. (Optional.)
 	// Filter results using the equals query parameter operator (eq).
 	// You can filter results that are equal to id, userName, emails, and external_id.
 	// For example, to search for an identity with the userName Octocat, you would use this query: ?filter=userName%20eq%20\"Octocat\".
 	// To filter results for the identity with the email octocat@github.com, you would use this query: ?filter=emails%20eq%20\"octocat@github.com\".
 	// (Optional.)
-	Filter *string `json:"filter,omitempty"`
+	Filter *string `url:"filter,omitempty"`
 }
 
 // ListSCIMProvisionedIdentities lists SCIM provisioned identities.
diff --git a/github/scim_test.go b/github/scim_test.go
index c2663bb..9e52747 100644
--- a/github/scim_test.go
+++ b/github/scim_test.go
@@ -7,6 +7,7 @@ package github
 
 import (
 	"context"
+	"fmt"
 	"net/http"
 	"testing"
 	"time"
@@ -428,22 +429,37 @@ func TestUpdateAttributeForSCIMUserOptions_Marshal(t *testing.T) {
 	testJSONMarshal(t, u, want)
 }
 
-func TestListSCIMProvisionedIdentitiesOptions_Marshal(t *testing.T) {
-	testJSONMarshal(t, &ListSCIMProvisionedIdentitiesOptions{}, `{}`)
+func TestListSCIMProvisionedIdentitiesOptions_addOptions(t *testing.T) {
+	testJSONMarshal(t, &ListSCIMProvisionedIdentitiesOptions{}, `{
+		"StartIndex": null,
+		"Count": null,
+		"Filter": null
+	}`)
 
-	u := &ListSCIMProvisionedIdentitiesOptions{
-		StartIndex: Int(1),
-		Count:      Int(10),
-		Filter:     String("test"),
-	}
+	url := "some/path"
 
-	want := `{
-		"startIndex": 1,
-		"count": 10,
-	 	"filter": "test"
-	}`
+	testAddURLOptions(t, url, &ListSCIMProvisionedIdentitiesOptions{}, url)
 
-	testJSONMarshal(t, u, want)
+	testAddURLOptions(
+		t,
+		url,
+		&ListSCIMProvisionedIdentitiesOptions{
+			StartIndex: Int(1),
+			Count:      Int(10),
+		},
+		fmt.Sprintf("%s?count=10&startIndex=1", url),
+	)
+
+	testAddURLOptions(
+		t,
+		url,
+		&ListSCIMProvisionedIdentitiesOptions{
+			StartIndex: Int(1),
+			Count:      Int(10),
+			Filter:     String("test"),
+		},
+		fmt.Sprintf("%s?count=10&filter=test&startIndex=1", url),
+	)
 }
 
 func TestSCIMUserName_Marshal(t *testing.T) {
diff --git a/github/search_test.go b/github/search_test.go
index 8998681..b746175 100644
--- a/github/search_test.go
+++ b/github/search_test.go
@@ -788,9 +788,9 @@ func TestIssuesSearchResult_Marshal(t *testing.T) {
 				Labels:            []*Label{{ID: Int64(1)}},
 				Assignee:          &User{ID: Int64(1)},
 				Comments:          Int(1),
-				ClosedAt:          &referenceTime,
-				CreatedAt:         &referenceTime,
-				UpdatedAt:         &referenceTime,
+				ClosedAt:          &Timestamp{referenceTime},
+				CreatedAt:         &Timestamp{referenceTime},
+				UpdatedAt:         &Timestamp{referenceTime},
 				ClosedBy:          &User{ID: Int64(1)},
 				URL:               String("url"),
 				HTMLURL:           String("hurl"),
diff --git a/github/teams.go b/github/teams.go
index 38845e0..0ee7c20 100644
--- a/github/teams.go
+++ b/github/teams.go
@@ -10,7 +10,6 @@ import (
 	"fmt"
 	"net/http"
 	"strings"
-	"time"
 )
 
 // TeamsService provides access to the team-related functions
@@ -68,7 +67,7 @@ type Invitation struct {
 	Email  *string `json:"email,omitempty"`
 	// Role can be one of the values - 'direct_member', 'admin', 'billing_manager', 'hiring_manager', or 'reinstate'.
 	Role              *string    `json:"role,omitempty"`
-	CreatedAt         *time.Time `json:"created_at,omitempty"`
+	CreatedAt         *Timestamp `json:"created_at,omitempty"`
 	Inviter           *User      `json:"inviter,omitempty"`
 	TeamCount         *int       `json:"team_count,omitempty"`
 	InvitationTeamURL *string    `json:"invitation_team_url,omitempty"`
@@ -914,7 +913,7 @@ type ListExternalGroupsOptions struct {
 	ListOptions
 }
 
-// ListExternalGroups lists external groups connected to a team on GitHub.
+// ListExternalGroups lists external groups in an organization on GitHub.
 //
 // GitHub API docs: https://docs.github.com/en/enterprise-cloud@latest/rest/teams/external-groups#list-external-groups-in-an-organization
 func (s *TeamsService) ListExternalGroups(ctx context.Context, org string, opts *ListExternalGroupsOptions) (*ExternalGroupList, *Response, error) {
@@ -938,6 +937,26 @@ func (s *TeamsService) ListExternalGroups(ctx context.Context, org string, opts
 	return externalGroups, resp, nil
 }
 
+// ListExternalGroupsForTeamBySlug lists external groups connected to a team on GitHub.
+//
+// GitHub API docs: https://docs.github.com/en/enterprise-cloud@latest/rest/teams/external-groups#list-a-connection-between-an-external-group-and-a-team
+func (s *TeamsService) ListExternalGroupsForTeamBySlug(ctx context.Context, org, slug string) (*ExternalGroupList, *Response, error) {
+	u := fmt.Sprintf("orgs/%v/teams/%v/external-groups", org, slug)
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	externalGroups := new(ExternalGroupList)
+	resp, err := s.client.Do(ctx, req, externalGroups)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return externalGroups, resp, nil
+}
+
 // UpdateConnectedExternalGroup updates the connection between an external group and a team.
 //
 // GitHub API docs: https://docs.github.com/en/enterprise-cloud@latest/rest/teams/external-groups#update-the-connection-between-an-external-group-and-a-team
diff --git a/github/teams_test.go b/github/teams_test.go
index 6085eac..d86fab7 100644
--- a/github/teams_test.go
+++ b/github/teams_test.go
@@ -1709,7 +1709,7 @@ func TestInvitation_Marshal(t *testing.T) {
 		Login:             String("login123"),
 		Email:             String("go@github.com"),
 		Role:              String("developer"),
-		CreatedAt:         &referenceTime,
+		CreatedAt:         &Timestamp{referenceTime},
 		TeamCount:         Int(99),
 		InvitationTeamURL: String("url"),
 	}
@@ -1935,6 +1935,79 @@ func TestTeamsService_ListExternalGroups_notFound(t *testing.T) {
 	}
 }
 
+func TestTeamsService_ListExternalGroupsForTeamBySlug(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{
+			"groups": [
+				{
+					"group_id": 123,
+					"group_name": "Octocat admins",
+					"updated_at": "2006-01-02T15:04:05Z"
+				}
+			]
+		}`)
+	})
+
+	ctx := context.Background()
+	list, _, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t")
+	if err != nil {
+		t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned error: %v", err)
+	}
+
+	want := &ExternalGroupList{
+		Groups: []*ExternalGroup{
+			{
+				GroupID:   Int64(123),
+				GroupName: String("Octocat admins"),
+				UpdatedAt: &Timestamp{Time: referenceTime},
+			},
+		},
+	}
+	if !cmp.Equal(list, want) {
+		t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned %+v, want %+v", list, want)
+	}
+
+	const methodName = "ListExternalGroupsForTeamBySlug"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Teams.ListExternalGroupsForTeamBySlug(ctx, "\n", "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestTeamsService_ListExternalGroupsForTeamBySlug_notFound(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		w.WriteHeader(http.StatusNotFound)
+	})
+
+	ctx := context.Background()
+	eg, resp, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t")
+	if err == nil {
+		t.Errorf("Expected HTTP 404 response")
+	}
+	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
+		t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned status %d, want %d", got, want)
+	}
+	if eg != nil {
+		t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned %+v, want nil", eg)
+	}
+}
+
 func TestTeamsService_UpdateConnectedExternalGroup(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
diff --git a/github/timestamp.go b/github/timestamp.go
index 1061a55..00c1235 100644
--- a/github/timestamp.go
+++ b/github/timestamp.go
@@ -22,6 +22,14 @@ func (t Timestamp) String() string {
 	return t.Time.String()
 }
 
+// GetTime returns std time.Time.
+func (t *Timestamp) GetTime() *time.Time {
+	if t == nil {
+		return nil
+	}
+	return &t.Time
+}
+
 // UnmarshalJSON implements the json.Unmarshaler interface.
 // Time is expected in RFC3339 or Unix format.
 func (t *Timestamp) UnmarshalJSON(data []byte) (err error) {
diff --git a/github/timestamp_test.go b/github/timestamp_test.go
index 0972495..69245b6 100644
--- a/github/timestamp_test.go
+++ b/github/timestamp_test.go
@@ -169,6 +169,17 @@ func TestWrappedTimestamp_Unmarshal(t *testing.T) {
 	}
 }
 
+func TestTimestamp_GetTime(t *testing.T) {
+	var t1 *Timestamp
+	if t1.GetTime() != nil {
+		t.Errorf("nil timestamp should return nil, got: %v", t1.GetTime())
+	}
+	t1 = &Timestamp{referenceTime}
+	if !t1.GetTime().Equal(referenceTime) {
+		t.Errorf("want reference time, got: %s", t1.GetTime().String())
+	}
+}
+
 func TestWrappedTimestamp_MarshalReflexivity(t *testing.T) {
 	testCases := []struct {
 		desc string
diff --git a/github/users.go b/github/users.go
index d40d23e..1b06701 100644
--- a/github/users.go
+++ b/github/users.go
@@ -41,8 +41,8 @@ type User struct {
 	SuspendedAt             *Timestamp `json:"suspended_at,omitempty"`
 	Type                    *string    `json:"type,omitempty"`
 	SiteAdmin               *bool      `json:"site_admin,omitempty"`
-	TotalPrivateRepos       *int       `json:"total_private_repos,omitempty"`
-	OwnedPrivateRepos       *int       `json:"owned_private_repos,omitempty"`
+	TotalPrivateRepos       *int64     `json:"total_private_repos,omitempty"`
+	OwnedPrivateRepos       *int64     `json:"owned_private_repos,omitempty"`
 	PrivateGists            *int       `json:"private_gists,omitempty"`
 	DiskUsage               *int       `json:"disk_usage,omitempty"`
 	Collaborators           *int       `json:"collaborators,omitempty"`
diff --git a/github/users_emails.go b/github/users_emails.go
index be7e0f8..67bd210 100644
--- a/github/users_emails.go
+++ b/github/users_emails.go
@@ -70,3 +70,28 @@ func (s *UsersService) DeleteEmails(ctx context.Context, emails []string) (*Resp
 
 	return s.client.Do(ctx, req, nil)
 }
+
+// SetEmailVisibility sets the visibility for the primary email address of the authenticated user.
+// `visibility` can be "private" or "public".
+//
+// GitHub API docs: https://docs.github.com/en/rest/users/emails#set-primary-email-visibility-for-the-authenticated-user
+func (s *UsersService) SetEmailVisibility(ctx context.Context, visibility string) ([]*UserEmail, *Response, error) {
+	u := "user/email/visibility"
+
+	updateVisiblilityReq := &UserEmail{
+		Visibility: &visibility,
+	}
+
+	req, err := s.client.NewRequest("PATCH", u, updateVisiblilityReq)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var e []*UserEmail
+	resp, err := s.client.Do(ctx, req, &e)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return e, resp, nil
+}
diff --git a/github/users_emails_test.go b/github/users_emails_test.go
index d40356d..ad9d32e 100644
--- a/github/users_emails_test.go
+++ b/github/users_emails_test.go
@@ -140,3 +140,47 @@ func TestUserEmail_Marshal(t *testing.T) {
 
 	testJSONMarshal(t, u, want)
 }
+
+func TestUsersService_SetEmailVisibility(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	input := &UserEmail{Visibility: String("private")}
+
+	mux.HandleFunc("/user/email/visibility", func(w http.ResponseWriter, r *http.Request) {
+		v := new(UserEmail)
+		json.NewDecoder(r.Body).Decode(&v)
+
+		testMethod(t, r, "PATCH")
+		if !cmp.Equal(v, input) {
+			t.Errorf("Request body = %+v, want %+v", v, input)
+		}
+
+		fmt.Fprint(w, `[{
+			"email": "user@example.com",
+			"verified": false,
+			"primary": true,
+			"visibility": "private"
+		}]`)
+	})
+
+	ctx := context.Background()
+	emails, _, err := client.Users.SetEmailVisibility(ctx, "private")
+	if err != nil {
+		t.Errorf("Users.SetEmailVisibility returned error: %v", err)
+	}
+
+	want := []*UserEmail{{Email: String("user@example.com"), Verified: Bool(false), Primary: Bool(true), Visibility: String("private")}}
+	if !cmp.Equal(emails, want) {
+		t.Errorf("Users.SetEmailVisibility returned %+v, want %+v", emails, want)
+	}
+
+	const methodName = "SetEmailVisibility"
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Users.SetEmailVisibility(ctx, "private")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
diff --git a/github/users_gpg_keys.go b/github/users_gpg_keys.go
index e9ce622..54189b8 100644
--- a/github/users_gpg_keys.go
+++ b/github/users_gpg_keys.go
@@ -8,7 +8,6 @@ package github
 import (
 	"context"
 	"fmt"
-	"time"
 )
 
 // GPGKey represents a GitHub user's public GPG key used to verify GPG signed commits and tags.
@@ -26,8 +25,8 @@ type GPGKey struct {
 	CanEncryptComms   *bool       `json:"can_encrypt_comms,omitempty"`
 	CanEncryptStorage *bool       `json:"can_encrypt_storage,omitempty"`
 	CanCertify        *bool       `json:"can_certify,omitempty"`
-	CreatedAt         *time.Time  `json:"created_at,omitempty"`
-	ExpiresAt         *time.Time  `json:"expires_at,omitempty"`
+	CreatedAt         *Timestamp  `json:"created_at,omitempty"`
+	ExpiresAt         *Timestamp  `json:"expires_at,omitempty"`
 }
 
 // String stringifies a GPGKey.
diff --git a/github/users_gpg_keys_test.go b/github/users_gpg_keys_test.go
index 2cef752..79ebd2d 100644
--- a/github/users_gpg_keys_test.go
+++ b/github/users_gpg_keys_test.go
@@ -11,7 +11,6 @@ import (
 	"fmt"
 	"net/http"
 	"testing"
-	"time"
 
 	"github.com/google/go-cmp/cmp"
 )
@@ -210,7 +209,7 @@ func TestGPGEmail_Marshal(t *testing.T) {
 func TestGPGKey_Marshal(t *testing.T) {
 	testJSONMarshal(t, &GPGKey{}, "{}")
 
-	ti := &time.Time{}
+	ti := &Timestamp{}
 
 	g := &GPGKey{
 		ID:           Int64(1),
diff --git a/github/users_keys.go b/github/users_keys.go
index 59d26cd..b49b8e4 100644
--- a/github/users_keys.go
+++ b/github/users_keys.go
@@ -19,6 +19,8 @@ type Key struct {
 	ReadOnly  *bool      `json:"read_only,omitempty"`
 	Verified  *bool      `json:"verified,omitempty"`
 	CreatedAt *Timestamp `json:"created_at,omitempty"`
+	AddedBy   *string    `json:"added_by,omitempty"`
+	LastUsed  *Timestamp `json:"last_used,omitempty"`
 }
 
 func (k Key) String() string {
diff --git a/github/users_test.go b/github/users_test.go
index 96b2e92..f71df5c 100644
--- a/github/users_test.go
+++ b/github/users_test.go
@@ -84,8 +84,8 @@ func TestUser_Marshal(t *testing.T) {
 		SuspendedAt:             &Timestamp{referenceTime},
 		Type:                    String("test type"),
 		SiteAdmin:               Bool(false),
-		TotalPrivateRepos:       Int(2),
-		OwnedPrivateRepos:       Int(1),
+		TotalPrivateRepos:       Int64(2),
+		OwnedPrivateRepos:       Int64(1),
 		PrivateGists:            Int(1),
 		DiskUsage:               Int(1),
 		Collaborators:           Int(1),
@@ -94,7 +94,7 @@ func TestUser_Marshal(t *testing.T) {
 			Name:          String("silver"),
 			Space:         Int(1024),
 			Collaborators: Int(10),
-			PrivateRepos:  Int(4),
+			PrivateRepos:  Int64(4),
 			FilledSeats:   Int(24),
 			Seats:         Int(1),
 		},
diff --git a/go.mod b/go.mod
index 656bb75..e67d5b4 100644
--- a/go.mod
+++ b/go.mod
@@ -1,16 +1,20 @@
-module github.com/google/go-github/v48
+module github.com/google/go-github/v52
 
 require (
+	github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8
 	github.com/google/go-cmp v0.5.9
 	github.com/google/go-querystring v1.1.0
-	golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
-	golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
+	golang.org/x/oauth2 v0.7.0
 )
 
 require (
-	github.com/golang/protobuf v1.3.2 // indirect
-	golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect
+	github.com/cloudflare/circl v1.1.0 // indirect
+	github.com/golang/protobuf v1.5.2 // indirect
+	golang.org/x/crypto v0.7.0 // indirect
+	golang.org/x/net v0.9.0 // indirect
+	golang.org/x/sys v0.7.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
+	google.golang.org/protobuf v1.28.0 // indirect
 )
 
 go 1.17
diff --git a/go.sum b/go.sum
index fc6f776..4692d98 100644
--- a/go.sum
+++ b/go.sum
@@ -1,22 +1,34 @@
+github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA=
+github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
+github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
+github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY=
+github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
-golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
+golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -25,3 +37,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/scrape/apps.go b/scrape/apps.go
index 55afeb6..59a58c1 100644
--- a/scrape/apps.go
+++ b/scrape/apps.go
@@ -17,7 +17,7 @@ import (
 	"strings"
 
 	"github.com/PuerkitoBio/goquery"
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v51/github"
 )
 
 // AppRestrictionsEnabled returns whether the specified organization has
diff --git a/scrape/apps_test.go b/scrape/apps_test.go
index 9726562..913588b 100644
--- a/scrape/apps_test.go
+++ b/scrape/apps_test.go
@@ -5,7 +5,7 @@ import (
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v51/github"
 )
 
 func Test_AppRestrictionsEnabled(t *testing.T) {
diff --git a/scrape/go.mod b/scrape/go.mod
index 3adfb07..296956c 100644
--- a/scrape/go.mod
+++ b/scrape/go.mod
@@ -3,9 +3,9 @@ module github.com/google/go-github/scrape
 go 1.13
 
 require (
-	github.com/PuerkitoBio/goquery v1.8.0
+	github.com/PuerkitoBio/goquery v1.8.1
 	github.com/google/go-cmp v0.5.9
-	github.com/google/go-github/v48 v48.0.0
-	github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119
-	golang.org/x/net v0.0.0-20210916014120-12bc252f5db8
+	github.com/google/go-github/v51 v51.0.0
+	github.com/xlzd/gotp v0.1.0
+	golang.org/x/net v0.9.0
 )
diff --git a/scrape/go.sum b/scrape/go.sum
index d1f7cb5..e32b45f 100644
--- a/scrape/go.sum
+++ b/scrape/go.sum
@@ -1,35 +1,83 @@
-github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
-github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
+cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA=
+github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
+github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM=
+github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
 github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
+github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY=
+github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-github/v48 v48.0.0 h1:9H5fWVXFK6ZsRriyPbjtnFAkJnoj0WKFtTYfpCRrTm8=
-github.com/google/go-github/v48 v48.0.0/go.mod h1:dDlehKBDo850ZPvCTK0sEqTCVWcrGl2LcDiajkYi89Y=
+github.com/google/go-github/v51 v51.0.0 h1:KCjsbgPV28VoRftdP+K2mQL16jniUsLAJknsOVKwHyU=
+github.com/google/go-github/v51 v51.0.0/go.mod h1:kZj/rn/c1lSUbr/PFWl2hhusPV7a5XNYKcwPrd5L3Us=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
-github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119 h1:YyPWX3jLOtYKulBR6AScGIs74lLrJcgeKRwcbAuQOG4=
-github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119/go.mod h1:/nuTSlK+okRfR/vnIPqR89fFKonnWPiZymN5ydRJkX8=
+github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po=
+github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
-golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210916014120-12bc252f5db8 h1:/6y1LfuqNuQdHAm0jjtPtgRcxIxjVZgm5OTu8/QhZvk=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw=
+golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/test/fields/fields.go b/test/fields/fields.go
index 3d42b7c..bebd0a3 100644
--- a/test/fields/fields.go
+++ b/test/fields/fields.go
@@ -25,8 +25,7 @@ import (
 	"reflect"
 	"strings"
 
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 )
 
 var (
@@ -47,10 +46,7 @@ func main() {
 		print("!!! No OAuth token. Some tests won't run. !!!\n\n")
 		client = github.NewClient(nil)
 	} else {
-		tc := oauth2.NewClient(context.Background(), oauth2.StaticTokenSource(
-			&oauth2.Token{AccessToken: token},
-		))
-		client = github.NewClient(tc)
+		client = github.NewTokenClient(context.Background(), token)
 		auth = true
 	}
 
diff --git a/test/integration/activity_test.go b/test/integration/activity_test.go
index 5d2f231..59f1795 100644
--- a/test/integration/activity_test.go
+++ b/test/integration/activity_test.go
@@ -12,7 +12,7 @@ import (
 	"context"
 	"testing"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 )
 
 const (
diff --git a/test/integration/authorizations_test.go b/test/integration/authorizations_test.go
index 50d38e0..3a7310e 100644
--- a/test/integration/authorizations_test.go
+++ b/test/integration/authorizations_test.go
@@ -17,7 +17,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 )
 
 const msgEnvMissing = "Skipping test because the required environment variable (%v) is not present."
diff --git a/test/integration/github_test.go b/test/integration/github_test.go
index aabada8..365b2c2 100644
--- a/test/integration/github_test.go
+++ b/test/integration/github_test.go
@@ -15,8 +15,7 @@ import (
 	"net/http"
 	"os"
 
-	"github.com/google/go-github/v48/github"
-	"golang.org/x/oauth2"
+	"github.com/google/go-github/v52/github"
 )
 
 var (
@@ -33,10 +32,7 @@ func init() {
 		print("!!! No OAuth token. Some tests won't run. !!!\n\n")
 		client = github.NewClient(nil)
 	} else {
-		tc := oauth2.NewClient(context.Background(), oauth2.StaticTokenSource(
-			&oauth2.Token{AccessToken: token},
-		))
-		client = github.NewClient(tc)
+		client = github.NewTokenClient(context.Background(), token)
 		auth = true
 	}
 }
diff --git a/test/integration/repos_test.go b/test/integration/repos_test.go
index 49ff98f..01c1ad4 100644
--- a/test/integration/repos_test.go
+++ b/test/integration/repos_test.go
@@ -15,7 +15,7 @@ import (
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 )
 
 func TestRepositories_CRUD(t *testing.T) {
@@ -112,7 +112,10 @@ func TestRepositories_EditBranches(t *testing.T) {
 		// TODO: Only organization repositories can have users and team restrictions.
 		//       In order to be able to test these Restrictions, need to add support
 		//       for creating temporary organization repositories.
-		Restrictions: nil,
+		Restrictions:     nil,
+		BlockCreations:   github.Bool(false),
+		LockBranch:       github.Bool(false),
+		AllowForkSyncing: github.Bool(false),
 	}
 
 	protection, _, err := client.Repositories.UpdateBranchProtection(context.Background(), *repo.Owner.Login, *repo.Name, "master", protectionRequest)
@@ -134,6 +137,15 @@ func TestRepositories_EditBranches(t *testing.T) {
 			Enabled: true,
 		},
 		Restrictions: nil,
+		BlockCreations: &github.BlockCreations{
+			Enabled: github.Bool(false),
+		},
+		LockBranch: &github.LockBranch{
+			Enabled: github.Bool(false),
+		},
+		AllowForkSyncing: &github.AllowForkSyncing{
+			Enabled: github.Bool(false),
+		},
 	}
 	if !cmp.Equal(protection, want) {
 		t.Errorf("Repositories.UpdateBranchProtection() returned %+v, want %+v", protection, want)
diff --git a/test/integration/users_test.go b/test/integration/users_test.go
index cd7797b..88a358b 100644
--- a/test/integration/users_test.go
+++ b/test/integration/users_test.go
@@ -14,7 +14,7 @@ import (
 	"math/rand"
 	"testing"
 
-	"github.com/google/go-github/v48/github"
+	"github.com/google/go-github/v52/github"
 )
 
 func TestUsers_Get(t *testing.T) {
diff --git a/update-urls/go.mod b/update-urls/go.mod
index 2fed223..7ac2c08 100644
--- a/update-urls/go.mod
+++ b/update-urls/go.mod
@@ -1,4 +1,4 @@
-module github.com/google/go-github/v48/update-urls
+module github.com/google/go-github/v52/update-urls
 
 go 1.16
 

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/share/doc/golang-github-google-go-github-dev/examples/ratelimit/main.go
-rw-r--r--  root/root   /usr/share/gocode/src/github.com/google/go-github/github/actions_cache.go
-rw-r--r--  root/root   /usr/share/gocode/src/github.com/google/go-github/github/actions_oidc.go
-rw-r--r--  root/root   /usr/share/gocode/src/github.com/google/go-github/github/actions_required_workflows.go
-rw-r--r--  root/root   /usr/share/gocode/src/github.com/google/go-github/github/actions_variables.go
-rw-r--r--  root/root   /usr/share/gocode/src/github.com/google/go-github/github/enterprise_code_security_and_analysis.go
-rw-r--r--  root/root   /usr/share/gocode/src/github.com/google/go-github/github/repos_actions_access.go
-rw-r--r--  root/root   /usr/share/gocode/src/github.com/google/go-github/github/repos_deployment_branch_policies.go

No differences were encountered in the control files

More details

Full run details