Repository: cloudflare/cloudflare-go
Pull request #1436 (2023-11-06 21:35:32)

GATE-4979: Add support for resolver policies
## Description

Resolver policies allow a Zero Trust customer to configure which upstream DNS Resolver to use when criteria in a a rule are matched.

This PR provides this functionality to Golang API Clients.

## Has your change been tested?

Additional serialization tests have been added

## Types of changes

What sort of change does your code introduce/modify?

- [x] New feature (non-breaking change which adds functionality)

## Checklist:

- [x] My code follows the code style of this project.
- [x] My change requires a change to the documentation.
- [x] I have updated the documentation accordingly.
- [x] I have added tests to cover my changes.
- [x] All new and existing tests passed.
- [x] This change is using publicly documented in [cloudflare/api-schemas](https://github.com/cloudflare/api-schemas) 
      and relies on stable APIs.

[1]: https://help.github.com/articles/closing-issues-using-keywords/


jacobbednarz: couple of small convention changes to address but looks good overall 👍 
joebb97: thanks Jacob, will fix these now
github-actions[bot]: Oops! It looks like no changelog entry is attached to this PR. Please include a release note as described in https://github.com/cloudflare/cloudflare-go/blob/master/docs/changelog-process.md.

Example: 

~~~
```release-note:TYPE
Release note
```
~~~

If you do not require a release note to be included, please add the `workflow/skip-changelog-entry` label.

Patch:
diff --git a/.changelog/1382.txt b/.changelog/1382.txt
deleted file mode 100644
index 6074328c9..000000000
--- a/.changelog/1382.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:bug
-semgrep: Improved IPv4 validation by implementing a new pattern to handle cases where non-IPv4 addresses were previously accepted.
-```
diff --git a/.changelog/1397.txt b/.changelog/1397.txt
deleted file mode 100644
index a3954f447..000000000
--- a/.changelog/1397.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release_note:enhancement
-api_shield: Add support for Get/Post/Delete operations in API Shield Endpoint Management
-```
\ No newline at end of file
diff --git a/.changelog/1401.txt b/.changelog/1401.txt
deleted file mode 100644
index b1ef19e84..000000000
--- a/.changelog/1401.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-observatory: add support for observatory API
-```
\ No newline at end of file
diff --git a/.changelog/1403.txt b/.changelog/1403.txt
deleted file mode 100644
index 92568c880..000000000
--- a/.changelog/1403.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-```release-note:enhancement
-access_application: Add support for tags
-```
-
-```release-note:enhancement
-access_tag: Add support for tags
-```
\ No newline at end of file
diff --git a/.changelog/1405.txt b/.changelog/1405.txt
deleted file mode 100644
index 353994093..000000000
--- a/.changelog/1405.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-```release-note:bug
-account_role: autopaginate all available results instead of a static number
-```
-
-```release-note:breaking-change
-account_role: `AccountRoles` has been renamed to `ListAccountRoles` to align with the updated method conventions
-```
-
-```release-note:breaking-change
-account_role: `AccountRole` has been renamed to `GetAccountRole` to align with the updated method conventions
-```
diff --git a/.changelog/1406.txt b/.changelog/1406.txt
deleted file mode 100644
index 248b681c5..000000000
--- a/.changelog/1406.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-api_shield_schema: Add support for managing schemas for API Shield Schema Validation 2.0
-```
diff --git a/.changelog/1407.txt b/.changelog/1407.txt
deleted file mode 100644
index 783277081..000000000
--- a/.changelog/1407.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-access_application: Add support for app launcher customization fields
-```
diff --git a/.changelog/1409.txt b/.changelog/1409.txt
deleted file mode 100644
index 3132d3b0d..000000000
--- a/.changelog/1409.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-list_item: allow filtering by search term, cursor and per page attributes
-```
diff --git a/.changelog/1410.txt b/.changelog/1410.txt
deleted file mode 100644
index 589d96d96..000000000
--- a/.changelog/1410.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:bug
-custom_nameservers: change `NSSet` from string to int to match API response
-```
diff --git a/.changelog/1412.txt b/.changelog/1412.txt
deleted file mode 100644
index fa44dd47e..000000000
--- a/.changelog/1412.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:bug
-observatory: fix double url encoding
-```
diff --git a/.changelog/1413.txt b/.changelog/1413.txt
deleted file mode 100644
index 9030b0c29..000000000
--- a/.changelog/1413.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-api_shield_discovery: Add support for Get/Patch API Shield API Discovery Operations
-```
diff --git a/.changelog/1414.txt b/.changelog/1414.txt
deleted file mode 100644
index 4af5cf907..000000000
--- a/.changelog/1414.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-load_balancing: extend documentation for least_connections steering policy
-```
\ No newline at end of file
diff --git a/.changelog/1415.txt b/.changelog/1415.txt
deleted file mode 100644
index 13ecd4428..000000000
--- a/.changelog/1415.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-```release-note:enhancement
-access_organization: Add support for session_duration
-```
-
-```release-note:enhancement
-access_policy: Add support for session_duration
-```
diff --git a/.changelog/1416.txt b/.changelog/1416.txt
deleted file mode 100644
index 63f14fe51..000000000
--- a/.changelog/1416.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:dependency
-deps: bumps golang.org/x/net from 0.15.0 to 0.16.0
-```
diff --git a/.changelog/1417.txt b/.changelog/1417.txt
deleted file mode 100644
index 03e478798..000000000
--- a/.changelog/1417.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-d1: adds support for d1
-```
diff --git a/.changelog/1418.txt b/.changelog/1418.txt
deleted file mode 100644
index 4cc578265..000000000
--- a/.changelog/1418.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-api_shield_schema: Add support for Get/Update API Shield Schema Validation Settings
-```
diff --git a/.changelog/1419.txt b/.changelog/1419.txt
deleted file mode 100644
index a17415283..000000000
--- a/.changelog/1419.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-teams: Add `audit_ssh_settings` endpoints
-```
diff --git a/.changelog/1420.txt b/.changelog/1420.txt
deleted file mode 100644
index 109580539..000000000
--- a/.changelog/1420.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:dependency
-deps: bumps golang.org/x/net from 0.16.0 to 0.17.0
-```
diff --git a/.changelog/1421.txt b/.changelog/1421.txt
deleted file mode 100644
index 860754977..000000000
--- a/.changelog/1421.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:dependency
-deps: bumps golang.org/x/net from 0.7.0 to 0.17.0
-```
diff --git a/.changelog/1422.txt b/.changelog/1422.txt
deleted file mode 100644
index 20d26bcc1..000000000
--- a/.changelog/1422.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-api_shield_schema: Add support for Get/Update API Shield Operation Schema Validation Settings
-```
diff --git a/.changelog/1423.txt b/.changelog/1423.txt
deleted file mode 100644
index 6a668eb11..000000000
--- a/.changelog/1423.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:enhancement
-teams: Add support for body_scanning (Enhanced File Detection) in teams account configuration
-```
diff --git a/.changelog/1424.txt b/.changelog/1424.txt
deleted file mode 100644
index f4659f00b..000000000
--- a/.changelog/1424.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-```release-note:enhancement
-teams: Add `non_identity_enabled` boolean in browser isolation settings
-```
-
-```release-note:breaking-change
-teams: `BrowserIsolation.UrlBrowserIsolationEnabled` has changed from `bool` to `*bool` to meet the library conventions
-```
diff --git a/.changelog/1427.txt b/.changelog/1427.txt
deleted file mode 100644
index d948ad913..000000000
--- a/.changelog/1427.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-```release-note:enhancement
-access_seats: Add UpdateAccessUserSeat() to list IP Access Rules
-```
-
-```release-note:enhancement
-access_user: Add GetAccessUserActiveSessions() to get all active sessions for a Access/Zero-Trust user.
-```
-
-```release-note:enhancement
-access_user: Add GetAccessUserSingleActiveSession() to get an active session for a Access/Zero-Trust user.
-```
-
-```release-note:enhancement
-access_user: Add GetAccessUserFailedLogins() to get all failed login attempts for a Access/Zero-Trust user.
-```
-
-```release-note:enhancement
-access_user: Add GetAccessUserLastSeenIdentity() to get last seen identity for a Access/Zero-Trust user.
-```
-
-```release-note:enhancement
-access_user: Add ListAccessUsers() to get a list of users for a Access/Zero-Trust account.
-```
diff --git a/.changelog/1433.txt b/.changelog/1433.txt
deleted file mode 100644
index b8cbacb05..000000000
--- a/.changelog/1433.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-```release-note:breaking-change
-devices_policy: `UpdateDeviceClientCertificatesZone` is renamed to `UpdateDeviceClientCertificates` with updated method signatures
-```
-
-```release-note:breaking-change
-devices_policy: `GetDeviceClientCertificatesZone` is renamed to `GetDeviceClientCertificates` with updated method signatures
-```
-
-```release-note:breaking-change
-devices_policy: `DeviceClientCertificates` is renamed to `DeviceClientCertificates`
-```
-
-```release-note:breaking-change
-devices_policy: `GetDeviceClientCertificates` is updated with method signatures matching the library conventions
-```
-
-```release-note:breaking-change
-devices_policy: `CreateDeviceSettingsPolicy` is updated with method signatures matching the library conventions
-```
-
-```release-note:breaking-change
-devices_policy: `UpdateDefaultDeviceSettingsPolicy` is updated with method signatures matching the library conventions
-```
-
-```release-note:breaking-change
-devices_policy: `UpdateDeviceSettingsPolicy` is updated with method signatures matching the library conventions
-```
-
-```release-note:breaking-change
-devices_policy: `DeleteDeviceSettingsPolicy` is updated with method signatures matching the library conventions
-```
-
-```release-note:breaking-change
-devices_policy: `GetDefaultDeviceSettingsPolicy` is updated with method signatures matching the library conventions
-```
-
-```release-note:breaking-change
-devices_policy: `GetDeviceSettingsPolicy` is updated with method signatures matching the library conventions
-```
-
-```release-note:enhancement
-devices_policy: Add support for listing device settings policies
-```
diff --git a/.changelog/1434.txt b/.changelog/1434.txt
deleted file mode 100644
index ef9d30dad..000000000
--- a/.changelog/1434.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-```release-note:dependency
-deps: bumps golang.org/x/time from 0.3.0 to 0.4.0
-```
diff --git a/.changelog/1436.txt b/.changelog/1436.txt
new file mode 100644
index 000000000..a3b6264dc
--- /dev/null
+++ b/.changelog/1436.txt
@@ -0,0 +1,3 @@
+```release-note:enhancement
+teams_rules: Add support for resolver policies
+```
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 6d349bc3c..fa62bc1f1 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,14 +1,10 @@
 version: 2
 updates:
-- package-ecosystem: "gomod"
+- package-ecosystem: gomod
   directory: "/"
   schedule:
-    interval: "daily"
+    interval: daily
 - package-ecosystem: "github-actions"
   directory: "/"
   schedule:
     interval: "daily"
-- package-ecosystem: "docker"
-  directory: "/"
-  schedule:
-    interval: "daily"
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 375176286..74804930c 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -16,4 +16,4 @@ jobs:
       - name: Run coverage
         run: go test ./... -coverprofile=coverage.txt -covermode=atomic
       - name: Upload coverage to Codecov
-        uses: codecov/codecov-action@v4.0.0-beta.3
+        uses: codecov/codecov-action@v4
diff --git a/.semgrep.yml b/.semgrep.yml
index e0a6dc4a5..000f8a23a 100644
--- a/.semgrep.yml
+++ b/.semgrep.yml
@@ -7,7 +7,7 @@ rules:
       include:
         - '*.go'
     patterns:
-      - pattern-regex: '(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
+      - pattern-regex: '\d+\.\d+\.\d+\.\d+'
       - pattern-not-regex: '10\.\d+\.\d+.\d+'
       - pattern-not-regex: '192\.168\.\d+.\d+'
       - pattern-not-regex: '192\.0\.2\.\d+'    # 192.0.2.0/24 (TEST-NET-1, rfc5737)
@@ -33,56 +33,3 @@ rules:
         - pattern: |
             errors.Wrap(...)
     severity: WARNING
-  - id: no-use-of-stdlib-json
-    languages:
-      - go
-    message: Favour "github.com/goccy/go-json" instead of "encoding/json" to allow better customisation of marshaling and unmarshaling JSON attributes. See https://github.com/cloudflare/cloudflare-go/pull/1360 for full details.
-    paths:
-      include:
-        - '*.go'
-    patterns:
-      - pattern-regex: '\"encoding\/json\"'
-    fix-regex:
-      regex: \".*\"
-      replacement: '"github.com/goccy/go-json"'
-    severity: WARNING
-  - id: use-pointers-for-booleans
-    languages:
-      - go
-    message: |
-      Booleans should always be represented as pointers in structs with an omitempty marshaling tag (most commonly as JSON). This ensures you can determine unset, false and truthy values.
-    paths:
-      include:
-        - '*.go'
-    patterns:
-      - pattern-regex: "bool"
-      - pattern-not-regex: "\\*bool"
-      - pattern-either:
-        - pattern-inside: |
-            type $STRUCTNAME struct {
-                ...
-            }
-    severity: WARNING
-    metadata:
-      references:
-        - https://github.com/cloudflare/cloudflare-go/blob/master/docs/conventions.md#booleans
-  - id: use-pointers-for-time
-    languages:
-      - go
-    message: |
-      time.Time should always be represented as pointers in structs.
-    paths:
-      include:
-        - '*.go'
-    patterns:
-      - pattern-regex: "time\\.Time"
-      - pattern-not-regex: "\\*time\\.Time"
-      - pattern-either:
-        - pattern-inside: |
-            type $STRUCTNAME struct {
-                ...
-            }
-    severity: WARNING
-    metadata:
-      references:
-        - https://github.com/cloudflare/cloudflare-go/blob/master/docs/conventions.md#timetime
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6f43dc217..65e4f2215 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,93 +1,4 @@
-## 0.81.0 (Unreleased)
-
-BREAKING CHANGES:
-
-* devices_policy: `CreateDeviceSettingsPolicy` is updated with method signatures matching the library conventions ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `DeleteDeviceSettingsPolicy` is updated with method signatures matching the library conventions ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `DeviceClientCertificates` is renamed to `DeviceClientCertificates` ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `GetDefaultDeviceSettingsPolicy` is updated with method signatures matching the library conventions ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `GetDeviceClientCertificatesZone` is renamed to `GetDeviceClientCertificates` with updated method signatures ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `GetDeviceClientCertificates` is updated with method signatures matching the library conventions ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `GetDeviceSettingsPolicy` is updated with method signatures matching the library conventions ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `UpdateDefaultDeviceSettingsPolicy` is updated with method signatures matching the library conventions ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `UpdateDeviceClientCertificatesZone` is renamed to `UpdateDeviceClientCertificates` with updated method signatures ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-* devices_policy: `UpdateDeviceSettingsPolicy` is updated with method signatures matching the library conventions ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-
-ENHANCEMENTS:
-
-* access_seats: Add UpdateAccessUserSeat() to list IP Access Rules ([#1427](https://github.com/cloudflare/cloudflare-go/issues/1427))
-* access_user: Add GetAccessUserActiveSessions() to get all active sessions for a Access/Zero-Trust user. ([#1427](https://github.com/cloudflare/cloudflare-go/issues/1427))
-* access_user: Add GetAccessUserFailedLogins() to get all failed login attempts for a Access/Zero-Trust user. ([#1427](https://github.com/cloudflare/cloudflare-go/issues/1427))
-* access_user: Add GetAccessUserLastSeenIdentity() to get last seen identity for a Access/Zero-Trust user. ([#1427](https://github.com/cloudflare/cloudflare-go/issues/1427))
-* access_user: Add GetAccessUserSingleActiveSession() to get an active session for a Access/Zero-Trust user. ([#1427](https://github.com/cloudflare/cloudflare-go/issues/1427))
-* access_user: Add ListAccessUsers() to get a list of users for a Access/Zero-Trust account. ([#1427](https://github.com/cloudflare/cloudflare-go/issues/1427))
-* devices_policy: Add support for listing device settings policies ([#1433](https://github.com/cloudflare/cloudflare-go/issues/1433))
-
-DEPENDENCIES:
-
-* deps: bumps golang.org/x/time from 0.3.0 to 0.4.0 ([#1434](https://github.com/cloudflare/cloudflare-go/issues/1434))
-
-## 0.80.0 (October 25th, 2023)
-
-BREAKING CHANGES:
-
-* teams: `BrowserIsolation.UrlBrowserIsolationEnabled` has changed from `bool` to `*bool` to meet the library conventions ([#1424](https://github.com/cloudflare/cloudflare-go/issues/1424))
-
-ENHANCEMENTS:
-
-* access_application: Add support for app launcher customization fields ([#1407](https://github.com/cloudflare/cloudflare-go/issues/1407))
-* api_shield_schema: Add support for Get/Update API Shield Operation Schema Validation Settings ([#1422](https://github.com/cloudflare/cloudflare-go/issues/1422))
-* api_shield_schema: Add support for Get/Update API Shield Schema Validation Settings ([#1418](https://github.com/cloudflare/cloudflare-go/issues/1418))
-* teams: Add support for body_scanning (Enhanced File Detection) in teams account configuration ([#1423](https://github.com/cloudflare/cloudflare-go/issues/1423))
-* load_balancing: extend documentation for least_connections steering policy ([#1414](https://github.com/cloudflare/cloudflare-go/issues/1414))
-* teams: Add `non_identity_enabled` boolean in browser isolation settings ([#1424](https://github.com/cloudflare/cloudflare-go/issues/1424))
-
-DEPENDENCIES:
-
-* deps: bumps golang.org/x/net from 0.7.0 to 0.17.0 ([#1421](https://github.com/cloudflare/cloudflare-go/issues/1421))
-
-## 0.79.0 (October 11th, 2023)
-
-ENHANCEMENTS:
-
-* access_organization: Add support for session_duration ([#1415](https://github.com/cloudflare/cloudflare-go/issues/1415))
-* access_policy: Add support for session_duration ([#1415](https://github.com/cloudflare/cloudflare-go/issues/1415))
-
-ENHANCEMENTS:
-
-* api_shield_discovery: Add support for Get/Patch API Shield API Discovery Operations ([#1413](https://github.com/cloudflare/cloudflare-go/issues/1413))
-* api_shield_schema: Add support for managing schemas for API Shield Schema Validation 2.0 ([#1406](https://github.com/cloudflare/cloudflare-go/issues/1406))
-* d1: adds support for d1 ([#1417](https://github.com/cloudflare/cloudflare-go/issues/1417))
-* teams: Add `audit_ssh_settings` endpoints ([#1419](https://github.com/cloudflare/cloudflare-go/issues/1419))
-
-BUG FIXES:
-
-* custom_nameservers: change `NSSet` from string to int to match API response ([#1410](https://github.com/cloudflare/cloudflare-go/issues/1410))
-* observatory: fix double url encoding ([#1412](https://github.com/cloudflare/cloudflare-go/issues/1412))
-
-DEPENDENCIES:
-
-* deps: bumps golang.org/x/net from 0.15.0 to 0.16.0 ([#1416](https://github.com/cloudflare/cloudflare-go/issues/1416))
-* deps: bumps golang.org/x/net from 0.16.0 to 0.17.0 ([#1420](https://github.com/cloudflare/cloudflare-go/issues/1420))
-
-## 0.78.0 (September 27th, 2023)
-
-BREAKING CHANGES:
-
-* account_role: `AccountRole` has been renamed to `GetAccountRole` to align with the updated method conventions ([#1405](https://github.com/cloudflare/cloudflare-go/issues/1405))
-* account_role: `AccountRoles` has been renamed to `ListAccountRoles` to align with the updated method conventions ([#1405](https://github.com/cloudflare/cloudflare-go/issues/1405))
-
-ENHANCEMENTS:
-
-* access_application: Add support for tags ([#1403](https://github.com/cloudflare/cloudflare-go/issues/1403))
-* access_tag: Add support for tags ([#1403](https://github.com/cloudflare/cloudflare-go/issues/1403))
-* list_item: allow filtering by search term, cursor and per page attributes ([#1409](https://github.com/cloudflare/cloudflare-go/issues/1409))
-* observatory: add support for observatory API ([#1401](https://github.com/cloudflare/cloudflare-go/issues/1401))
-
-BUG FIXES:
-
-* account_role: autopaginate all available results instead of a static number ([#1405](https://github.com/cloudflare/cloudflare-go/issues/1405))
-* semgrep: Improved IPv4 validation by implementing a new pattern to handle cases where non-IPv4 addresses were previously accepted. ([#1382](https://github.com/cloudflare/cloudflare-go/issues/1382))
+## 0.78.0 (Unreleased)
 
 DEPENDENCIES:
 
diff --git a/access_application.go b/access_application.go
index 6e62b2de2..898b3a637 100644
--- a/access_application.go
+++ b/access_application.go
@@ -53,8 +53,6 @@ type AccessApplication struct {
 	ServiceAuth401Redirect   *bool                          `json:"service_auth_401_redirect,omitempty"`
 	PathCookieAttribute      *bool                          `json:"path_cookie_attribute,omitempty"`
 	CustomPages              []string                       `json:"custom_pages,omitempty"`
-	Tags                     []string                       `json:"tags,omitempty"`
-	AccessAppLauncherCustomization
 }
 
 type AccessApplicationGatewayRule struct {
@@ -117,26 +115,6 @@ type SaasApplication struct {
 	CustomAttributes   []SAMLAttributeConfig `json:"custom_attributes,omitempty"`
 }
 
-type AccessAppLauncherCustomization struct {
-	LandingPageDesign     AccessLandingPageDesign `json:"landing_page_design"`
-	LogoURL               string                  `json:"app_launcher_logo_url"`
-	HeaderBackgroundColor string                  `json:"header_bg_color"`
-	BackgroundColor       string                  `json:"bg_color"`
-	FooterLinks           []AccessFooterLink      `json:"footer_links"`
-}
-
-type AccessFooterLink struct {
-	Name string `json:"name"`
-	URL  string `json:"url"`
-}
-
-type AccessLandingPageDesign struct {
-	Title           string `json:"title"`
-	Message         string `json:"message"`
-	ImageURL        string `json:"image_url"`
-	ButtonColor     string `json:"button_color"`
-	ButtonTextColor string `json:"button_text_color"`
-}
 type ListAccessApplicationsParams struct {
 	ResultInfo
 }
@@ -166,8 +144,6 @@ type CreateAccessApplicationParams struct {
 	SkipInterstitial         *bool                          `json:"skip_interstitial,omitempty"`
 	Type                     AccessApplicationType          `json:"type,omitempty"`
 	CustomPages              []string                       `json:"custom_pages,omitempty"`
-	Tags                     []string                       `json:"tags,omitempty"`
-	AccessAppLauncherCustomization
 }
 
 type UpdateAccessApplicationParams struct {
@@ -196,8 +172,6 @@ type UpdateAccessApplicationParams struct {
 	SkipInterstitial         *bool                          `json:"skip_interstitial,omitempty"`
 	Type                     AccessApplicationType          `json:"type,omitempty"`
 	CustomPages              []string                       `json:"custom_pages,omitempty"`
-	Tags                     []string                       `json:"tags,omitempty"`
-	AccessAppLauncherCustomization
 }
 
 // ListAccessApplications returns all applications within an account or zone.
diff --git a/access_organization.go b/access_organization.go
index bb02b1ca4..ef48e2f22 100644
--- a/access_organization.go
+++ b/access_organization.go
@@ -20,7 +20,6 @@ type AccessOrganization struct {
 	UIReadOnlyToggleReason         string                        `json:"ui_read_only_toggle_reason,omitempty"`
 	UserSeatExpirationInactiveTime string                        `json:"user_seat_expiration_inactive_time,omitempty"`
 	AutoRedirectToIdentity         *bool                         `json:"auto_redirect_to_identity,omitempty"`
-	SessionDuration                *string                       `json:"session_duration,omitempty"`
 	CustomPages                    AccessOrganizationCustomPages `json:"custom_pages,omitempty"`
 }
 
@@ -65,7 +64,6 @@ type CreateAccessOrganizationParams struct {
 	UIReadOnlyToggleReason         string                        `json:"ui_read_only_toggle_reason,omitempty"`
 	UserSeatExpirationInactiveTime string                        `json:"user_seat_expiration_inactive_time,omitempty"`
 	AutoRedirectToIdentity         *bool                         `json:"auto_redirect_to_identity,omitempty"`
-	SessionDuration                *string                       `json:"session_duration,omitempty"`
 	CustomPages                    AccessOrganizationCustomPages `json:"custom_pages,omitempty"`
 }
 
@@ -77,7 +75,6 @@ type UpdateAccessOrganizationParams struct {
 	UIReadOnlyToggleReason         string                        `json:"ui_read_only_toggle_reason,omitempty"`
 	UserSeatExpirationInactiveTime string                        `json:"user_seat_expiration_inactive_time,omitempty"`
 	AutoRedirectToIdentity         *bool                         `json:"auto_redirect_to_identity,omitempty"`
-	SessionDuration                *string                       `json:"session_duration,omitempty"`
 	CustomPages                    AccessOrganizationCustomPages `json:"custom_pages,omitempty"`
 }
 
diff --git a/access_policy.go b/access_policy.go
index 0e1ae41c6..4219446f2 100644
--- a/access_policy.go
+++ b/access_policy.go
@@ -31,7 +31,6 @@ type AccessPolicy struct {
 	Name       string     `json:"name"`
 
 	IsolationRequired            *bool                 `json:"isolation_required,omitempty"`
-	SessionDuration              *string               `json:"session_duration,omitempty"`
 	PurposeJustificationRequired *bool                 `json:"purpose_justification_required,omitempty"`
 	PurposeJustificationPrompt   *string               `json:"purpose_justification_prompt,omitempty"`
 	ApprovalRequired             *bool                 `json:"approval_required,omitempty"`
@@ -85,7 +84,6 @@ type CreateAccessPolicyParams struct {
 	Name       string `json:"name"`
 
 	IsolationRequired            *bool                 `json:"isolation_required,omitempty"`
-	SessionDuration              *string               `json:"session_duration,omitempty"`
 	PurposeJustificationRequired *bool                 `json:"purpose_justification_required,omitempty"`
 	PurposeJustificationPrompt   *string               `json:"purpose_justification_prompt,omitempty"`
 	ApprovalRequired             *bool                 `json:"approval_required,omitempty"`
@@ -113,7 +111,6 @@ type UpdateAccessPolicyParams struct {
 	Name       string `json:"name"`
 
 	IsolationRequired            *bool                 `json:"isolation_required,omitempty"`
-	SessionDuration              *string               `json:"session_duration,omitempty"`
 	PurposeJustificationRequired *bool                 `json:"purpose_justification_required,omitempty"`
 	PurposeJustificationPrompt   *string               `json:"purpose_justification_prompt,omitempty"`
 	ApprovalRequired             *bool                 `json:"approval_required,omitempty"`
diff --git a/access_seats.go b/access_seats.go
deleted file mode 100644
index c1d6bf213..000000000
--- a/access_seats.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"errors"
-	"fmt"
-	"net/http"
-	"time"
-
-	"github.com/goccy/go-json"
-)
-
-var errMissingAccessSeatUID = errors.New("missing required access seat UID")
-
-// AccessUpdateAccessUserSeatResult represents a Access User Seat.
-type AccessUpdateAccessUserSeatResult struct {
-	AccessSeat  *bool      `json:"access_seat"`
-	CreatedAt   *time.Time `json:"created_at"`
-	UpdatedAt   *time.Time `json:"updated_at"`
-	GatewaySeat *bool      `json:"gateway_seat"`
-	SeatUID     string     `json:"seat_uid,omitempty"`
-}
-
-// UpdateAccessUserSeatParams represents the update payload for access seats.
-type UpdateAccessUserSeatParams struct {
-	SeatUID     string `json:"seat_uid,omitempty"`
-	AccessSeat  *bool  `json:"access_seat"`
-	GatewaySeat *bool  `json:"gateway_seat"`
-}
-
-// AccessUserSeatResponse represents the response from the access user seat endpoints.
-type UpdateAccessUserSeatResponse struct {
-	Response
-	Result     []AccessUpdateAccessUserSeatResult `json:"result"`
-	ResultInfo `json:"result_info"`
-}
-
-// UpdateAccessUserSeat updates a Access User Seat.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/zero-trust-seats-update-a-user-seat
-func (api *API) UpdateAccessUserSeat(ctx context.Context, rc *ResourceContainer, params UpdateAccessUserSeatParams) ([]AccessUpdateAccessUserSeatResult, error) {
-	if rc.Level != AccountRouteLevel {
-		return []AccessUpdateAccessUserSeatResult{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	if params.SeatUID == "" {
-		return []AccessUpdateAccessUserSeatResult{}, errMissingAccessSeatUID
-	}
-
-	uri := fmt.Sprintf(
-		"/%s/%s/access/seats",
-		rc.Level,
-		rc.Identifier,
-	)
-
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
-	if err != nil {
-		return []AccessUpdateAccessUserSeatResult{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
-	}
-
-	var updateAccessUserSeatResponse UpdateAccessUserSeatResponse
-	err = json.Unmarshal(res, &updateAccessUserSeatResponse)
-	if err != nil {
-		return []AccessUpdateAccessUserSeatResult{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return updateAccessUserSeatResponse.Result, nil
-}
diff --git a/access_tag.go b/access_tag.go
deleted file mode 100644
index 9bba613d1..000000000
--- a/access_tag.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-
-	"github.com/goccy/go-json"
-)
-
-type AccessTag struct {
-	Name     string `json:"name,omitempty"`
-	AppCount int    `json:"app_count,omitempty"`
-}
-
-type AccessTagListResponse struct {
-	Response
-	Result     []AccessTag `json:"result"`
-	ResultInfo `json:"result_info"`
-}
-
-type AccessTagResponse struct {
-	Response
-	Result AccessTag `json:"result"`
-}
-
-type ListAccessTagsParams struct{}
-
-type CreateAccessTagParams struct {
-	Name string `json:"name,omitempty"`
-}
-
-func (api *API) ListAccessTags(ctx context.Context, rc *ResourceContainer, params ListAccessTagsParams) ([]AccessTag, error) {
-	uri := buildURI(fmt.Sprintf("/%s/%s/access/tags", rc.Level, rc.Identifier), params)
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return []AccessTag{}, err
-	}
-
-	var TagsResponse AccessTagListResponse
-	err = json.Unmarshal(res, &TagsResponse)
-	if err != nil {
-		return []AccessTag{}, err
-	}
-	return TagsResponse.Result, nil
-}
-
-func (api *API) GetAccessTag(ctx context.Context, rc *ResourceContainer, tagName string) (AccessTag, error) {
-	uri := fmt.Sprintf("/%s/%s/access/tags/%s", rc.Level, rc.Identifier, tagName)
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return AccessTag{}, err
-	}
-
-	var TagResponse AccessTagResponse
-	err = json.Unmarshal(res, &TagResponse)
-	if err != nil {
-		return AccessTag{}, err
-	}
-	return TagResponse.Result, nil
-}
-
-func (api *API) CreateAccessTag(ctx context.Context, rc *ResourceContainer, params CreateAccessTagParams) (AccessTag, error) {
-	uri := fmt.Sprintf("/%s/%s/access/tags", rc.Level, rc.Identifier)
-	res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
-	if err != nil {
-		return AccessTag{}, err
-	}
-
-	var TagResponse AccessTagResponse
-	err = json.Unmarshal(res, &TagResponse)
-	if err != nil {
-		return AccessTag{}, err
-	}
-	return TagResponse.Result, nil
-}
-
-func (api *API) DeleteAccessTag(ctx context.Context, rc *ResourceContainer, tagName string) error {
-	uri := fmt.Sprintf("/%s/%s/access/tags/%s", rc.Level, rc.Identifier, tagName)
-	_, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
-	if err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/access_users.go b/access_users.go
deleted file mode 100644
index 690bc446e..000000000
--- a/access_users.go
+++ /dev/null
@@ -1,360 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-
-	"github.com/goccy/go-json"
-)
-
-type AccessUserActiveSessionsResponse struct {
-	Result     []AccessUserActiveSessionResult `json:"result"`
-	ResultInfo `json:"result_info"`
-	Response
-}
-
-type AccessUserActiveSessionResult struct {
-	Expiration int64                           `json:"expiration"`
-	Metadata   AccessUserActiveSessionMetadata `json:"metadata"`
-	Name       string                          `json:"name"`
-}
-
-type AccessUserActiveSessionMetadata struct {
-	Apps    map[string]AccessUserActiveSessionMetadataApp `json:"apps"`
-	Expires int64                                         `json:"expires"`
-	IAT     int64                                         `json:"iat"`
-	Nonce   string                                        `json:"nonce"`
-	TTL     int64                                         `json:"ttl"`
-}
-
-type AccessUserActiveSessionMetadataApp struct {
-	Hostname string `json:"hostname"`
-	Name     string `json:"name"`
-	Type     string `json:"type"`
-	UID      string `json:"uid"`
-}
-
-type AccessUserDevicePosture struct {
-	Check       AccessUserDevicePostureCheck `json:"check"`
-	Data        map[string]interface{}       `json:"data"`
-	Description string                       `json:"description"`
-	Error       string                       `json:"error"`
-	ID          string                       `json:"id"`
-	RuleName    string                       `json:"rule_name"`
-	Success     *bool                        `json:"success"`
-	Timestamp   string                       `json:"timestamp"`
-	Type        string                       `json:"type"`
-}
-
-type AccessUserDeviceSession struct {
-	LastAuthenticated int64 `json:"last_authenticated"`
-}
-
-type AccessUserFailedLoginsResponse struct {
-	Result     []AccessUserFailedLoginResult `json:"result"`
-	ResultInfo `json:"result_info"`
-	Response
-}
-
-type AccessUserFailedLoginResult struct {
-	Expiration int64                         `json:"expiration"`
-	Metadata   AccessUserFailedLoginMetadata `json:"metadata"`
-}
-
-type AccessUserFailedLoginMetadata struct {
-	AppName   string `json:"app_name"`
-	Aud       string `json:"aud"`
-	Datetime  string `json:"datetime"`
-	RayID     string `json:"ray_id"`
-	UserEmail string `json:"user_email"`
-	UserUUID  string `json:"user_uuid"`
-}
-
-type AccessUserLastSeenIdentityResponse struct {
-	Result     AccessUserLastSeenIdentityResult `json:"result"`
-	ResultInfo ResultInfo                       `json:"result_info"`
-	Response
-}
-
-type AccessUserLastSeenIdentityResult struct {
-	AccountID          string                             `json:"account_id"`
-	AuthStatus         string                             `json:"auth_status"`
-	CommonName         string                             `json:"common_name"`
-	DeviceID           string                             `json:"device_id"`
-	DevicePosture      map[string]AccessUserDevicePosture `json:"devicePosture"`
-	DeviceSessions     map[string]AccessUserDeviceSession `json:"device_sessions"`
-	Email              string                             `json:"email"`
-	Geo                AccessUserIdentityGeo              `json:"geo"`
-	IAT                int64                              `json:"iat"`
-	IDP                AccessUserIDP                      `json:"idp"`
-	IP                 string                             `json:"ip"`
-	IsGateway          *bool                              `json:"is_gateway"`
-	IsWarp             *bool                              `json:"is_warp"`
-	MtlsAuth           AccessUserMTLSAuth                 `json:"mtls_auth"`
-	ServiceTokenID     string                             `json:"service_token_id"`
-	ServiceTokenStatus *bool                              `json:"service_token_status"`
-	UserUUID           string                             `json:"user_uuid"`
-	Version            int                                `json:"version"`
-}
-
-type AccessUserLastSeenIdentitySessionResponse struct {
-	Result     GetAccessUserLastSeenIdentityResult `json:"result"`
-	ResultInfo ResultInfo                          `json:"result_info"`
-	Response
-}
-
-type GetAccessUserLastSeenIdentityResult struct {
-	AccountID          string                             `json:"account_id"`
-	AuthStatus         string                             `json:"auth_status"`
-	CommonName         string                             `json:"common_name"`
-	DevicePosture      map[string]AccessUserDevicePosture `json:"devicePosture"`
-	DeviceSessions     map[string]AccessUserDeviceSession `json:"device_sessions"`
-	DeviceID           string                             `json:"device_id"`
-	Email              string                             `json:"email"`
-	Geo                AccessUserIdentityGeo              `json:"geo"`
-	IAT                int64                              `json:"iat"`
-	IDP                AccessUserIDP                      `json:"idp"`
-	IP                 string                             `json:"ip"`
-	IsGateway          *bool                              `json:"is_gateway"`
-	IsWarp             *bool                              `json:"is_warp"`
-	MtlsAuth           AccessUserMTLSAuth                 `json:"mtls_auth"`
-	ServiceTokenID     string                             `json:"service_token_id"`
-	ServiceTokenStatus *bool                              `json:"service_token_status"`
-	UserUUID           string                             `json:"user_uuid"`
-	Version            int                                `json:"version"`
-}
-
-type AccessUserDevicePostureCheck struct {
-	Exists *bool  `json:"exists"`
-	Path   string `json:"path"`
-}
-
-type AccessUserIdentityGeo struct {
-	Country string `json:"country"`
-}
-
-type AccessUserIDP struct {
-	ID   string `json:"id"`
-	Type string `json:"type"`
-}
-
-type AccessUserMTLSAuth struct {
-	AuthStatus    string `json:"auth_status"`
-	CertIssuerDN  string `json:"cert_issuer_dn"`
-	CertIssuerSKI string `json:"cert_issuer_ski"`
-	CertPresented *bool  `json:"cert_presented"`
-	CertSerial    string `json:"cert_serial"`
-}
-
-type AccessUserListResponse struct {
-	Result     []AccessUser `json:"result"`
-	ResultInfo `json:"result_info"`
-	Response
-}
-
-type AccessUser struct {
-	ID                  string `json:"id"`
-	AccessSeat          *bool  `json:"access_seat"`
-	ActiveDeviceCount   int    `json:"active_device_count"`
-	CreatedAt           string `json:"created_at"`
-	Email               string `json:"email"`
-	GatewaySeat         *bool  `json:"gateway_seat"`
-	LastSuccessfulLogin string `json:"last_successful_login"`
-	Name                string `json:"name"`
-	SeatUID             string `json:"seat_uid"`
-	UID                 string `json:"uid"`
-	UpdatedAt           string `json:"updated_at"`
-}
-
-type AccessUserParams struct {
-	ResultInfo
-}
-
-type GetAccessUserSingleActiveSessionResponse struct {
-	Result     GetAccessUserSingleActiveSessionResult `json:"result"`
-	ResultInfo `json:"result_info"`
-	Response
-}
-
-type GetAccessUserSingleActiveSessionResult struct {
-	AccountID          string                             `json:"account_id"`
-	AuthStatus         string                             `json:"auth_status"`
-	CommonName         string                             `json:"common_name"`
-	DevicePosture      map[string]AccessUserDevicePosture `json:"devicePosture"`
-	DeviceSessions     map[string]AccessUserDeviceSession `json:"device_sessions"`
-	DeviceID           string                             `json:"device_id"`
-	Email              string                             `json:"email"`
-	Geo                AccessUserIdentityGeo              `json:"geo"`
-	IAT                int64                              `json:"iat"`
-	IDP                AccessUserIDP                      `json:"idp"`
-	IP                 string                             `json:"ip"`
-	IsGateway          *bool                              `json:"is_gateway"`
-	IsWarp             *bool                              `json:"is_warp"`
-	MtlsAuth           AccessUserMTLSAuth                 `json:"mtls_auth"`
-	ServiceTokenID     string                             `json:"service_token_id"`
-	ServiceTokenStatus *bool                              `json:"service_token_status"`
-	UserUUID           string                             `json:"user_uuid"`
-	Version            int                                `json:"version"`
-	IsActive           *bool                              `json:"isActive"`
-}
-
-// ListAccessUsers returns a list of users for a single cloudflare access/zerotrust account.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/zero-trust-users-get-users
-func (api *API) ListAccessUsers(ctx context.Context, rc *ResourceContainer, params AccessUserParams) ([]AccessUser, *ResultInfo, error) {
-	if rc.Level != AccountRouteLevel {
-		return []AccessUser{}, &ResultInfo{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	baseURL := fmt.Sprintf("/%s/%s/access/users", rc.Level, rc.Identifier)
-
-	autoPaginate := true
-	if params.PerPage >= 1 || params.Page >= 1 {
-		autoPaginate = false
-	}
-
-	if params.PerPage < 1 {
-		params.PerPage = 25
-	}
-
-	if params.Page < 1 {
-		params.Page = 1
-	}
-
-	var accessUsers []AccessUser
-	var r AccessUserListResponse
-
-	for {
-		uri := buildURI(baseURL, params)
-		res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-		if err != nil {
-			return []AccessUser{}, &ResultInfo{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
-		}
-
-		err = json.Unmarshal(res, &r)
-		if err != nil {
-			return []AccessUser{}, &ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-		}
-		accessUsers = append(accessUsers, r.Result...)
-		params.ResultInfo = r.ResultInfo.Next()
-		if params.ResultInfo.Done() || !autoPaginate {
-			break
-		}
-	}
-
-	return accessUsers, &r.ResultInfo, nil
-}
-
-// GetAccessUserActiveSessions returns a list of active sessions for an user.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/zero-trust-users-get-active-sessions
-func (api *API) GetAccessUserActiveSessions(ctx context.Context, rc *ResourceContainer, userID string) ([]AccessUserActiveSessionResult, error) {
-	if rc.Level != AccountRouteLevel {
-		return []AccessUserActiveSessionResult{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf(
-		"/%s/%s/access/users/%s/active_sessions",
-		rc.Level,
-		rc.Identifier,
-		userID,
-	)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return []AccessUserActiveSessionResult{}, err
-	}
-
-	var accessUserActiveSessionsResponse AccessUserActiveSessionsResponse
-	err = json.Unmarshal(res, &accessUserActiveSessionsResponse)
-	if err != nil {
-		return []AccessUserActiveSessionResult{}, err
-	}
-	return accessUserActiveSessionsResponse.Result, nil
-}
-
-// GetAccessUserSingleActiveSession returns a single active session for a user.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/zero-trust-users-get-active-session
-func (api *API) GetAccessUserSingleActiveSession(ctx context.Context, rc *ResourceContainer, userID string, sessionID string) (GetAccessUserSingleActiveSessionResult, error) {
-	if rc.Level != AccountRouteLevel {
-		return GetAccessUserSingleActiveSessionResult{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf(
-		"/%s/%s/access/users/%s/active_sessions/%s",
-		rc.Level,
-		rc.Identifier,
-		userID,
-		sessionID,
-	)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return GetAccessUserSingleActiveSessionResult{}, err
-	}
-
-	var accessUserActiveSingleSessionsResponse GetAccessUserSingleActiveSessionResponse
-	err = json.Unmarshal(res, &accessUserActiveSingleSessionsResponse)
-	if err != nil {
-		return GetAccessUserSingleActiveSessionResult{}, err
-	}
-	return accessUserActiveSingleSessionsResponse.Result, nil
-}
-
-// GetAccessUserFailedLogins returns a list of failed logins for a user.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/zero-trust-users-get-failed-logins
-func (api *API) GetAccessUserFailedLogins(ctx context.Context, rc *ResourceContainer, userID string) ([]AccessUserFailedLoginResult, error) {
-	if rc.Level != AccountRouteLevel {
-		return []AccessUserFailedLoginResult{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf(
-		"/%s/%s/access/users/%s/failed_logins",
-		rc.Level,
-		rc.Identifier,
-		userID,
-	)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return []AccessUserFailedLoginResult{}, err
-	}
-
-	var accessUserFailedLoginsResponse AccessUserFailedLoginsResponse
-	err = json.Unmarshal(res, &accessUserFailedLoginsResponse)
-	if err != nil {
-		return []AccessUserFailedLoginResult{}, err
-	}
-	return accessUserFailedLoginsResponse.Result, nil
-}
-
-// GetAccessUserLastSeenIdentity returns the last seen identity for a user.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/zero-trust-users-get-last-seen-identity
-func (api *API) GetAccessUserLastSeenIdentity(ctx context.Context, rc *ResourceContainer, userID string) (GetAccessUserLastSeenIdentityResult, error) {
-	if rc.Level != AccountRouteLevel {
-		return GetAccessUserLastSeenIdentityResult{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf(
-		"/%s/%s/access/users/%s/last_seen_identity",
-		rc.Level,
-		rc.Identifier,
-		userID,
-	)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return GetAccessUserLastSeenIdentityResult{}, err
-	}
-
-	var accessUserLastSeenIdentityResponse AccessUserLastSeenIdentitySessionResponse
-	err = json.Unmarshal(res, &accessUserLastSeenIdentityResponse)
-	if err != nil {
-		return GetAccessUserLastSeenIdentityResult{}, err
-	}
-	return accessUserLastSeenIdentityResponse.Result, nil
-}
diff --git a/account_roles.go b/account_roles.go
index d216ae310..dec1da81c 100644
--- a/account_roles.go
+++ b/account_roles.go
@@ -40,65 +40,35 @@ type AccountRoleDetailResponse struct {
 	Result   AccountRole `json:"result"`
 }
 
-type ListAccountRolesParams struct {
-	ResultInfo
-}
-
-// ListAccountRoles returns all roles of an account.
+// AccountRoles returns all roles of an account.
 //
-// API reference: https://developers.cloudflare.com/api/operations/account-roles-list-roles
-func (api *API) ListAccountRoles(ctx context.Context, rc *ResourceContainer, params ListAccountRolesParams) ([]AccountRole, error) {
-	if rc.Identifier == "" {
-		return []AccountRole{}, ErrMissingAccountID
-	}
-	autoPaginate := true
-	if params.PerPage >= 1 || params.Page >= 1 {
-		autoPaginate = false
-	}
-
-	if params.PerPage < 1 {
-		params.PerPage = 25
-	}
+// API reference: https://api.cloudflare.com/#account-roles-list-roles
+func (api *API) AccountRoles(ctx context.Context, accountID string) ([]AccountRole, error) {
+	uri := fmt.Sprintf("/accounts/%s/roles?per_page=50", accountID)
 
-	if params.Page < 1 {
-		params.Page = 1
+	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
+	if err != nil {
+		return []AccountRole{}, err
 	}
-	var roles []AccountRole
-	var r AccountRolesListResponse
-	for {
-		uri := buildURI(fmt.Sprintf("/accounts/%s/roles", rc.Identifier), params)
-
-		res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-		if err != nil {
-			return []AccountRole{}, err
-		}
 
-		err = json.Unmarshal(res, &r)
-		if err != nil {
-			return []AccountRole{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-		}
-		roles = append(roles, r.Result...)
-		params.ResultInfo = r.ResultInfo.Next()
-		if params.ResultInfo.Done() || !autoPaginate {
-			break
-		}
+	var accountRolesListResponse AccountRolesListResponse
+	err = json.Unmarshal(res, &accountRolesListResponse)
+	if err != nil {
+		return []AccountRole{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
 	}
 
-	return roles, nil
+	return accountRolesListResponse.Result, nil
 }
 
-// GetAccountRole returns the details of a single account role.
+// AccountRole returns the details of a single account role.
 //
-// API reference: https://developers.cloudflare.com/api/operations/account-roles-role-details
-func (api *API) GetAccountRole(ctx context.Context, rc *ResourceContainer, roleID string) (AccountRole, error) {
-	if rc.Identifier == "" {
-		return AccountRole{}, ErrMissingAccountID
-	}
-	uri := fmt.Sprintf("/accounts/%s/roles/%s", rc.Identifier, roleID)
+// API reference: https://api.cloudflare.com/#account-roles-role-details
+func (api *API) AccountRole(ctx context.Context, accountID string, roleID string) (AccountRole, error) {
+	uri := fmt.Sprintf("/accounts/%s/roles/%s", accountID, roleID)
 
 	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
 	if err != nil {
-		return AccountRole{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
+		return AccountRole{}, err
 	}
 
 	var accountRole AccountRoleDetailResponse
diff --git a/api_shield_api_discovery.go b/api_shield_api_discovery.go
deleted file mode 100644
index 69b3ad243..000000000
--- a/api_shield_api_discovery.go
+++ /dev/null
@@ -1,190 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"time"
-
-	"github.com/goccy/go-json"
-)
-
-// APIShieldDiscoveryOrigin is an enumeration on what discovery engine an operation was discovered by.
-type APIShieldDiscoveryOrigin string
-
-const (
-
-	// APIShieldDiscoveryOriginML discovered operations that were sourced using ML API Discovery.
-	APIShieldDiscoveryOriginML APIShieldDiscoveryOrigin = "ML"
-	// APIShieldDiscoveryOriginSessionIdentifier discovered operations that were sourced using Session Identifier
-	// API Discovery.
-	APIShieldDiscoveryOriginSessionIdentifier APIShieldDiscoveryOrigin = "SessionIdentifier"
-)
-
-// APIShieldDiscoveryState is an enumeration on states a discovery operation can be in.
-type APIShieldDiscoveryState string
-
-const (
-	// APIShieldDiscoveryStateReview discovered operations that are not saved into API Shield Endpoint Management.
-	APIShieldDiscoveryStateReview APIShieldDiscoveryState = "review"
-	// APIShieldDiscoveryStateSaved discovered operations that are already saved into API Shield Endpoint Management.
-	APIShieldDiscoveryStateSaved APIShieldDiscoveryState = "saved"
-	// APIShieldDiscoveryStateIgnored discovered operations that have been marked as ignored.
-	APIShieldDiscoveryStateIgnored APIShieldDiscoveryState = "ignored"
-)
-
-// APIShieldDiscoveryOperation is an operation that was discovered by API Discovery.
-type APIShieldDiscoveryOperation struct {
-	// ID represents the ID of the operation, formatted as UUID
-	ID string `json:"id"`
-	// Origin represents the API discovery engine(s) that discovered this operation
-	Origin []APIShieldDiscoveryOrigin `json:"origin"`
-	// State represents the state of operation in API Discovery
-	State APIShieldDiscoveryState `json:"state"`
-	// LastUpdated timestamp of when this operation was last updated
-	LastUpdated *time.Time `json:"last_updated"`
-	// Features are additional data about the operation
-	Features map[string]any `json:"features,omitempty"`
-
-	Method   string `json:"method"`
-	Host     string `json:"host"`
-	Endpoint string `json:"endpoint"`
-}
-
-// ListAPIShieldDiscoveryOperationsParams represents the parameters to pass when retrieving discovered operations.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-api-discovery-retrieve-discovered-operations-on-a-zone
-type ListAPIShieldDiscoveryOperationsParams struct {
-	// Direction to order results.
-	Direction string `url:"direction,omitempty"`
-	// OrderBy when requesting a feature, the feature keys are available for ordering as well, e.g., thresholds.suggested_threshold.
-	OrderBy string `url:"order,omitempty"`
-	// Hosts filters results to only include the specified hosts.
-	Hosts []string `url:"host,omitempty"`
-	// Methods filters results to only include the specified methods.
-	Methods []string `url:"method,omitempty"`
-	// Endpoint filters results to only include endpoints containing this pattern.
-	Endpoint string `url:"endpoint,omitempty"`
-	// Diff when true, only return API Discovery results that are not saved into API Shield Endpoint Management
-	Diff bool `url:"diff,omitempty"`
-	// Origin filters results to only include discovery results sourced from a particular discovery engine
-	// See APIShieldDiscoveryOrigin for valid values.
-	Origin APIShieldDiscoveryOrigin `url:"origin,omitempty"`
-	// State filters results to only include discovery results in a particular state
-	// See APIShieldDiscoveryState for valid values.
-	State APIShieldDiscoveryState `url:"state,omitempty"`
-
-	// Pagination options to apply to the request.
-	PaginationOptions
-}
-
-// UpdateAPIShieldDiscoveryOperationParams represents the parameters to pass to patch a discovery operation
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-api-patch-discovered-operation
-type UpdateAPIShieldDiscoveryOperationParams struct {
-	// OperationID is the ID, formatted as UUID, of the operation to be updated
-	OperationID string                  `json:"-" url:"-"`
-	State       APIShieldDiscoveryState `json:"state" url:"-"`
-}
-
-// UpdateAPIShieldDiscoveryOperationsParams maps discovery operation IDs to PatchAPIShieldDiscoveryOperation structs
-//
-// Example:
-//
-//	UpdateAPIShieldDiscoveryOperations{
-//			"99522293-a505-45e5-bbad-bbc339f5dc40": PatchAPIShieldDiscoveryOperation{ State: "review" },
-//	}
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-api-patch-discovered-operations
-type UpdateAPIShieldDiscoveryOperationsParams map[string]UpdateAPIShieldDiscoveryOperation
-
-// UpdateAPIShieldDiscoveryOperation represents the state to set on a discovery operation.
-type UpdateAPIShieldDiscoveryOperation struct {
-	// State is the state to set on the operation
-	State APIShieldDiscoveryState `json:"state" url:"-"`
-}
-
-// APIShieldListDiscoveryOperationsResponse represents the response from the api_gateway/discovery/operations endpoint.
-type APIShieldListDiscoveryOperationsResponse struct {
-	Result     []APIShieldDiscoveryOperation `json:"result"`
-	ResultInfo `json:"result_info"`
-	Response
-}
-
-// APIShieldPatchDiscoveryOperationResponse represents the response from the PATCH api_gateway/discovery/operations/{id} endpoint.
-type APIShieldPatchDiscoveryOperationResponse struct {
-	Result UpdateAPIShieldDiscoveryOperation `json:"result"`
-	Response
-}
-
-// APIShieldPatchDiscoveryOperationsResponse represents the response from the PATCH api_gateway/discovery/operations endpoint.
-type APIShieldPatchDiscoveryOperationsResponse struct {
-	Result UpdateAPIShieldDiscoveryOperationsParams `json:"result"`
-	Response
-}
-
-// ListAPIShieldDiscoveryOperations retrieve the most up to date view of discovered operations.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-api-discovery-retrieve-discovered-operations-on-a-zone
-func (api *API) ListAPIShieldDiscoveryOperations(ctx context.Context, rc *ResourceContainer, params ListAPIShieldDiscoveryOperationsParams) ([]APIShieldDiscoveryOperation, ResultInfo, error) {
-	uri := buildURI(fmt.Sprintf("/zones/%s/api_gateway/discovery/operations", rc.Identifier), params)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, ResultInfo{}, err
-	}
-
-	var asResponse APIShieldListDiscoveryOperationsResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return asResponse.Result, asResponse.ResultInfo, nil
-}
-
-// UpdateAPIShieldDiscoveryOperation updates certain fields on a discovered operation.
-//
-// API Documentation: https://developers.cloudflare.com/api/operations/api-shield-api-patch-discovered-operation
-func (api *API) UpdateAPIShieldDiscoveryOperation(ctx context.Context, rc *ResourceContainer, params UpdateAPIShieldDiscoveryOperationParams) (*UpdateAPIShieldDiscoveryOperation, error) {
-	if params.OperationID == "" {
-		return nil, fmt.Errorf("operation ID must be provided")
-	}
-
-	uri := fmt.Sprintf("/zones/%s/api_gateway/discovery/operations/%s", rc.Identifier, params.OperationID)
-
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
-	if err != nil {
-		return nil, err
-	}
-
-	// Result should be the updated schema that was patched
-	var asResponse APIShieldPatchDiscoveryOperationResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
-
-// UpdateAPIShieldDiscoveryOperations bulk updates certain fields on multiple discovered operations
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-api-patch-discovered-operations
-func (api *API) UpdateAPIShieldDiscoveryOperations(ctx context.Context, rc *ResourceContainer, params UpdateAPIShieldDiscoveryOperationsParams) (*UpdateAPIShieldDiscoveryOperationsParams, error) {
-	uri := fmt.Sprintf("/zones/%s/api_gateway/discovery/operations", rc.Identifier)
-
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
-	if err != nil {
-		return nil, err
-	}
-
-	// Result should be the updated schema that was patched
-	var asResponse APIShieldPatchDiscoveryOperationsResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
diff --git a/api_shield_operations.go b/api_shield_operations.go
deleted file mode 100644
index 1d89a1754..000000000
--- a/api_shield_operations.go
+++ /dev/null
@@ -1,185 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"time"
-
-	"github.com/goccy/go-json"
-)
-
-// APIShieldOperation represents an operation stored in API Shield Endpoint Management.
-type APIShieldOperation struct {
-	APIShieldBasicOperation
-	ID          string         `json:"operation_id"`
-	LastUpdated *time.Time     `json:"last_updated"`
-	Features    map[string]any `json:"features,omitempty"`
-}
-
-// GetAPIShieldOperationParams represents the parameters to pass when retrieving an operation.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-an-operation
-type GetAPIShieldOperationParams struct {
-	// The Operation ID to retrieve
-	OperationID string `url:"-"`
-	// Features represents a set of features to return in `features` object when
-	// performing making read requests against an Operation or listing operations.
-	Features []string `url:"feature,omitempty"`
-}
-
-// CreateAPIShieldOperationsParams represents the parameters to pass when adding one or more operations.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-add-operations-to-a-zone
-type CreateAPIShieldOperationsParams struct {
-	// Operations are a slice of operations to be created in API Shield Endpoint Management
-	Operations []APIShieldBasicOperation `url:"-"`
-}
-
-// APIShieldBasicOperation should be used when creating an operation in API Shield Endpoint Management.
-type APIShieldBasicOperation struct {
-	Method   string `json:"method"`
-	Host     string `json:"host"`
-	Endpoint string `json:"endpoint"`
-}
-
-// DeleteAPIShieldOperationParams represents the parameters to pass to delete an operation.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-delete-an-operation
-type DeleteAPIShieldOperationParams struct {
-	// OperationID is the operation to be deleted
-	OperationID string `url:"-"`
-}
-
-// ListAPIShieldOperationsParams represents the parameters to pass when retrieving operations
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-all-operations-on-a-zone
-type ListAPIShieldOperationsParams struct {
-	// Features represents a set of features to return in `features` object when
-	// performing making read requests against an Operation or listing operations.
-	Features []string `url:"feature,omitempty"`
-	// Direction to order results.
-	Direction string `url:"direction,omitempty"`
-	// OrderBy when requesting a feature, the feature keys are available for ordering as well, e.g., thresholds.suggested_threshold.
-	OrderBy string `url:"order,omitempty"`
-	// Filters to only return operations that match filtering criteria, see APIShieldGetOperationsFilters
-	APIShieldListOperationsFilters
-	// Pagination options to apply to the request.
-	PaginationOptions
-}
-
-// APIShieldListOperationsFilters represents the filtering query parameters to set when retrieving operations
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-all-operations-on-a-zone
-type APIShieldListOperationsFilters struct {
-	// Hosts filters results to only include the specified hosts.
-	Hosts []string `url:"host,omitempty"`
-	// Methods filters results to only include the specified methods.
-	Methods []string `url:"method,omitempty"`
-	// Endpoint filter results to only include endpoints containing this pattern.
-	Endpoint string `url:"endpoint,omitempty"`
-}
-
-// APIShieldGetOperationResponse represents the response from the api_gateway/operations/{id} endpoint.
-type APIShieldGetOperationResponse struct {
-	Result APIShieldOperation `json:"result"`
-	Response
-}
-
-// APIShieldGetOperationsResponse represents the response from the api_gateway/operations endpoint.
-type APIShieldGetOperationsResponse struct {
-	Result     []APIShieldOperation `json:"result"`
-	ResultInfo `json:"result_info"`
-	Response
-}
-
-// APIShieldDeleteOperationResponse represents the response from the api_gateway/operations/{id} endpoint (DELETE).
-type APIShieldDeleteOperationResponse struct {
-	Result interface{} `json:"result"`
-	Response
-}
-
-// GetAPIShieldOperation returns information about an operation
-//
-// API documentation https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-an-operation
-func (api *API) GetAPIShieldOperation(ctx context.Context, rc *ResourceContainer, params GetAPIShieldOperationParams) (*APIShieldOperation, error) {
-	path := fmt.Sprintf("/zones/%s/api_gateway/operations/%s", rc.Identifier, params.OperationID)
-
-	uri := buildURI(path, params)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-
-	var asResponse APIShieldGetOperationResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
-
-// ListAPIShieldOperations retrieve information about all operations on a zone
-//
-// API documentation https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-all-operations-on-a-zone
-func (api *API) ListAPIShieldOperations(ctx context.Context, rc *ResourceContainer, params ListAPIShieldOperationsParams) ([]APIShieldOperation, ResultInfo, error) {
-	path := fmt.Sprintf("/zones/%s/api_gateway/operations", rc.Identifier)
-
-	uri := buildURI(path, params)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, ResultInfo{}, err
-	}
-
-	var asResponse APIShieldGetOperationsResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return asResponse.Result, asResponse.ResultInfo, nil
-}
-
-// CreateAPIShieldOperations add one or more operations to a zone.
-//
-// API documentation https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-add-operations-to-a-zone
-func (api *API) CreateAPIShieldOperations(ctx context.Context, rc *ResourceContainer, params CreateAPIShieldOperationsParams) ([]APIShieldOperation, error) {
-	uri := fmt.Sprintf("/zones/%s/api_gateway/operations", rc.Identifier)
-
-	res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params.Operations)
-	if err != nil {
-		return nil, err
-	}
-
-	// Result should be all the operations added to the zone, similar to doing GetAPIShieldOperations
-	var asResponse APIShieldGetOperationsResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return asResponse.Result, nil
-}
-
-// DeleteAPIShieldOperation deletes a single operation
-//
-// API documentation https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-delete-an-operation
-func (api *API) DeleteAPIShieldOperation(ctx context.Context, rc *ResourceContainer, params DeleteAPIShieldOperationParams) error {
-	uri := fmt.Sprintf("/zones/%s/api_gateway/operations/%s", rc.Identifier, params.OperationID)
-
-	res, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
-	if err != nil {
-		return err
-	}
-
-	var asResponse APIShieldDeleteOperationResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return nil
-}
diff --git a/api_shield_schemas.go b/api_shield_schemas.go
deleted file mode 100644
index 804181d86..000000000
--- a/api_shield_schemas.go
+++ /dev/null
@@ -1,505 +0,0 @@
-package cloudflare
-
-import (
-	"bytes"
-	"context"
-	"fmt"
-	"io"
-	"mime/multipart"
-	"net/http"
-	"strconv"
-	"time"
-
-	"github.com/goccy/go-json"
-)
-
-// APIShieldSchema represents a schema stored in API Shield Schema Validation 2.0.
-type APIShieldSchema struct {
-	// ID represents the ID of the schema
-	ID string `json:"schema_id"`
-	// Name represents the name of the schema
-	Name string `json:"name"`
-	// Kind of the schema
-	Kind string `json:"kind"`
-	// Source is the contents of the schema
-	Source string `json:"source,omitempty"`
-	// CreatedAt is the time the schema was created
-	CreatedAt *time.Time `json:"created_at,omitempty"`
-	// ValidationEnabled controls if schema is used for validation
-	ValidationEnabled bool `json:"validation_enabled,omitempty"`
-}
-
-// CreateAPIShieldSchemaParams represents the parameters to pass when creating a schema in Schema Validation 2.0.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-post-schema
-type CreateAPIShieldSchemaParams struct {
-	// Source is a io.Reader containing the contents of the schema
-	Source io.Reader
-	// Name represents the name of the schema.
-	Name string
-	// Kind of the schema. This is always set to openapi_v3.
-	Kind string
-	// ValidationEnabled controls if schema is used for validation
-	ValidationEnabled *bool
-}
-
-// GetAPIShieldSchemaParams represents the parameters to pass when retrieving a schema with a given schema ID.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-retrieve-information-about-specific-schema
-type GetAPIShieldSchemaParams struct {
-	// SchemaID is the ID of the schema to retrieve
-	SchemaID string `url:"-"`
-
-	// OmitSource specifies whether the contents of the schema should be returned in the "Source" field.
-	OmitSource *bool `url:"omit_source,omitempty"`
-}
-
-// ListAPIShieldSchemasParams represents the parameters to pass when retrieving all schemas.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-retrieve-information-about-all-schemas
-type ListAPIShieldSchemasParams struct {
-	// OmitSource specifies whether the contents of the schema should be returned in the "Source" field.
-	OmitSource *bool `url:"omit_source,omitempty"`
-
-	// ValidationEnabled specifies whether to return only schemas that have validation enabled.
-	ValidationEnabled *bool `url:"validation_enabled,omitempty"`
-
-	// PaginationOptions to apply to the request.
-	PaginationOptions
-}
-
-// DeleteAPIShieldSchemaParams represents the parameters to pass to delete a schema.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-delete-a-schema
-type DeleteAPIShieldSchemaParams struct {
-	// SchemaID is the schema to be deleted
-	SchemaID string `url:"-"`
-}
-
-// UpdateAPIShieldSchemaParams represents the parameters to pass to patch certain fields on an existing schema
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-enable-validation-for-a-schema
-type UpdateAPIShieldSchemaParams struct {
-	// SchemaID is the schema to be patched
-	SchemaID string `json:"-" url:"-"`
-
-	// ValidationEnabled controls if schema is used for validation
-	ValidationEnabled *bool `json:"validation_enabled" url:"-"`
-}
-
-// APIShieldGetSchemaResponse represents the response from the GET api_gateway/user_schemas/{id} endpoint.
-type APIShieldGetSchemaResponse struct {
-	Result APIShieldSchema `json:"result"`
-	Response
-}
-
-// APIShieldListSchemasResponse represents the response from the GET api_gateway/user_schemas endpoint.
-type APIShieldListSchemasResponse struct {
-	Result     []APIShieldSchema `json:"result"`
-	ResultInfo `json:"result_info"`
-	Response
-}
-
-// APIShieldCreateSchemaResponse represents the response from the POST api_gateway/user_schemas endpoint.
-type APIShieldCreateSchemaResponse struct {
-	Result APIShieldCreateSchemaResult `json:"result"`
-	Response
-}
-
-// APIShieldDeleteSchemaResponse represents the response from the DELETE api_gateway/user_schemas/{id} endpoint.
-type APIShieldDeleteSchemaResponse struct {
-	Result interface{} `json:"result"`
-	Response
-}
-
-// APIShieldPatchSchemaResponse represents the response from the PATCH api_gateway/user_schemas/{id} endpoint.
-type APIShieldPatchSchemaResponse struct {
-	Result APIShieldSchema `json:"result"`
-	Response
-}
-
-// APIShieldCreateSchemaResult represents the successful result of creating a schema in Schema Validation 2.0.
-type APIShieldCreateSchemaResult struct {
-	// APIShieldSchema is the schema that was created
-	Schema APIShieldSchema `json:"schema"`
-	// APIShieldCreateSchemaEvents are non-critical event logs that occurred during processing.
-	Events APIShieldCreateSchemaEvents `json:"upload_details"`
-}
-
-// APIShieldCreateSchemaEvents are event logs that occurred during processing.
-//
-// The logs are separated into levels of severity.
-type APIShieldCreateSchemaEvents struct {
-	Critical *APIShieldCreateSchemaEventWithLocation   `json:"critical,omitempty"`
-	Errors   []APIShieldCreateSchemaEventWithLocations `json:"errors,omitempty"`
-	Warnings []APIShieldCreateSchemaEventWithLocations `json:"warnings,omitempty"`
-}
-
-// APIShieldCreateSchemaEvent is an event log that occurred during processing.
-type APIShieldCreateSchemaEvent struct {
-	// Code identifies the event that occurred
-	Code uint `json:"code"`
-	// Message describes the event that occurred
-	Message string `json:"message"`
-}
-
-// APIShieldCreateSchemaEventWithLocation is an event log that occurred during processing, with the location
-// in the schema where the event occurred.
-type APIShieldCreateSchemaEventWithLocation struct {
-	APIShieldCreateSchemaEvent
-
-	// Location is where the event occurred
-	// See https://goessner.net/articles/JsonPath/ for JSONPath specification.
-	Location string `json:"location,omitempty"`
-}
-
-// APIShieldCreateSchemaEventWithLocations is an event log that occurred during processing, with the location(s)
-// in the schema where the event occurred.
-type APIShieldCreateSchemaEventWithLocations struct {
-	APIShieldCreateSchemaEvent
-
-	// Locations lists JSONPath locations where the event occurred
-	// See https://goessner.net/articles/JsonPath/ for JSONPath specification
-	Locations []string `json:"locations"`
-}
-
-func (cse APIShieldCreateSchemaEventWithLocations) String() string {
-	var s string
-	s += cse.Message
-
-	if len(cse.Locations) == 0 || (len(cse.Locations) == 1 && cse.Locations[0] == "") {
-		// append nothing
-	} else if len(cse.Locations) == 1 {
-		s += fmt.Sprintf(" (%s)", cse.Locations[0])
-	} else {
-		s += " (multiple locations)"
-	}
-
-	return s
-}
-
-// GetAPIShieldSchema retrieves information about a specific schema on a zone
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-retrieve-information-about-specific-schema
-func (api *API) GetAPIShieldSchema(ctx context.Context, rc *ResourceContainer, params GetAPIShieldSchemaParams) (*APIShieldSchema, error) {
-	if params.SchemaID == "" {
-		return nil, fmt.Errorf("schema ID must be provided")
-	}
-
-	path := fmt.Sprintf("/zones/%s/api_gateway/user_schemas/%s", rc.Identifier, params.SchemaID)
-
-	uri := buildURI(path, params)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-
-	var asResponse APIShieldGetSchemaResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
-
-// ListAPIShieldSchemas retrieves all schemas for a zone
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-retrieve-information-about-all-schemas
-func (api *API) ListAPIShieldSchemas(ctx context.Context, rc *ResourceContainer, params ListAPIShieldSchemasParams) ([]APIShieldSchema, ResultInfo, error) {
-	path := fmt.Sprintf("/zones/%s/api_gateway/user_schemas", rc.Identifier)
-
-	uri := buildURI(path, params)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, ResultInfo{}, err
-	}
-
-	var asResponse APIShieldListSchemasResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return asResponse.Result, asResponse.ResultInfo, nil
-}
-
-// CreateAPIShieldSchema uploads a schema to a zone
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-post-schema
-func (api *API) CreateAPIShieldSchema(ctx context.Context, rc *ResourceContainer, params CreateAPIShieldSchemaParams) (*APIShieldCreateSchemaResult, error) {
-	uri := fmt.Sprintf("/zones/%s/api_gateway/user_schemas", rc.Identifier)
-
-	if params.Name == "" {
-		return nil, fmt.Errorf("name must not be empty")
-	}
-
-	if params.Source == nil {
-		return nil, fmt.Errorf("source must not be nil")
-	}
-
-	// Prepare the form to be submitted
-	var b bytes.Buffer
-	w := multipart.NewWriter(&b)
-	// write fields
-	if err := w.WriteField("name", params.Name); err != nil {
-		return nil, fmt.Errorf("error during multi-part form construction: %w", err)
-	}
-	if err := w.WriteField("kind", params.Kind); err != nil {
-		return nil, fmt.Errorf("error during multi-part form construction: %w", err)
-	}
-
-	if params.ValidationEnabled != nil {
-		if err := w.WriteField("validation_enabled", strconv.FormatBool(*params.ValidationEnabled)); err != nil {
-			return nil, fmt.Errorf("error during multi-part form construction: %w", err)
-		}
-	}
-
-	// write schema contents
-	part, err := w.CreateFormFile("file", params.Name)
-	if err != nil {
-		return nil, fmt.Errorf("error during multi-part form construction: %w", err)
-	}
-	if _, err := io.Copy(part, params.Source); err != nil {
-		return nil, fmt.Errorf("error during multi-part form construction: %w", err)
-	}
-	if err := w.Close(); err != nil {
-		return nil, fmt.Errorf("error during multi-part form construction: %w", err)
-	}
-
-	res, err := api.makeRequestContextWithHeaders(ctx, http.MethodPost, uri, &b, http.Header{
-		"Content-Type": []string{w.FormDataContentType()},
-	})
-	if err != nil {
-		return nil, err
-	}
-
-	var asResponse APIShieldCreateSchemaResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
-
-// DeleteAPIShieldSchema deletes a single schema
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-delete-a-schema
-func (api *API) DeleteAPIShieldSchema(ctx context.Context, rc *ResourceContainer, params DeleteAPIShieldSchemaParams) error {
-	if params.SchemaID == "" {
-		return fmt.Errorf("schema ID must be provided")
-	}
-
-	uri := fmt.Sprintf("/zones/%s/api_gateway/user_schemas/%s", rc.Identifier, params.SchemaID)
-
-	res, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
-	if err != nil {
-		return err
-	}
-
-	var asResponse APIShieldDeleteSchemaResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return nil
-}
-
-// UpdateAPIShieldSchema updates certain fields on an existing schema.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-enable-validation-for-a-schema
-func (api *API) UpdateAPIShieldSchema(ctx context.Context, rc *ResourceContainer, params UpdateAPIShieldSchemaParams) (*APIShieldSchema, error) {
-	if params.SchemaID == "" {
-		return nil, fmt.Errorf("schema ID must be provided")
-	}
-
-	uri := fmt.Sprintf("/zones/%s/api_gateway/user_schemas/%s", rc.Identifier, params.SchemaID)
-
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
-	if err != nil {
-		return nil, err
-	}
-
-	// Result should be the updated schema that was patched
-	var asResponse APIShieldPatchSchemaResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
-
-// Schema Validation Settings
-
-// APIShieldSchemaValidationSettings represents zone level schema validation settings for
-// API Shield Schema Validation 2.0.
-type APIShieldSchemaValidationSettings struct {
-	// DefaultMitigationAction is the mitigation to apply when there is no operation-level
-	// mitigation action defined
-	DefaultMitigationAction string `json:"validation_default_mitigation_action" url:"-"`
-	// OverrideMitigationAction when set, will apply to all requests regardless of
-	// zone-level/operation-level setting
-	OverrideMitigationAction *string `json:"validation_override_mitigation_action" url:"-"`
-}
-
-// UpdateAPIShieldSchemaValidationSettingsParams represents the parameters to pass to update certain fields
-// on schema validation settings on the zone
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-patch-zone-level-settings
-type UpdateAPIShieldSchemaValidationSettingsParams struct {
-	// DefaultMitigationAction is the mitigation to apply when there is no operation-level
-	// mitigation action defined
-	//
-	// passing a `nil` value will have no effect on this setting
-	DefaultMitigationAction *string `json:"validation_default_mitigation_action" url:"-"`
-
-	// OverrideMitigationAction when set, will apply to all requests regardless of
-	// zone-level/operation-level setting
-	//
-	// passing a `nil` value will have no effect on this setting
-	OverrideMitigationAction *string `json:"validation_override_mitigation_action" url:"-"`
-}
-
-// APIShieldSchemaValidationSettingsResponse represents the response from the GET api_gateway/settings/schema_validation endpoint.
-type APIShieldSchemaValidationSettingsResponse struct {
-	Result APIShieldSchemaValidationSettings `json:"result"`
-	Response
-}
-
-// GetAPIShieldSchemaValidationSettings retrieves zone level schema validation settings
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-retrieve-zone-level-settings
-func (api *API) GetAPIShieldSchemaValidationSettings(ctx context.Context, rc *ResourceContainer) (*APIShieldSchemaValidationSettings, error) {
-	path := fmt.Sprintf("/zones/%s/api_gateway/settings/schema_validation", rc.Identifier)
-
-	uri := buildURI(path, nil)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-
-	var asResponse APIShieldSchemaValidationSettingsResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
-
-// UpdateAPIShieldSchemaValidationSettings updates certain fields on zone level schema validation settings
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-patch-zone-level-settings
-func (api *API) UpdateAPIShieldSchemaValidationSettings(ctx context.Context, rc *ResourceContainer, params UpdateAPIShieldSchemaValidationSettingsParams) (*APIShieldSchemaValidationSettings, error) {
-	path := fmt.Sprintf("/zones/%s/api_gateway/settings/schema_validation", rc.Identifier)
-
-	uri := buildURI(path, params)
-
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
-	if err != nil {
-		return nil, err
-	}
-
-	var asResponse APIShieldSchemaValidationSettingsResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
-
-// APIShieldOperationSchemaValidationSettings represents operation level schema validation settings for
-// API Shield Schema Validation 2.0.
-type APIShieldOperationSchemaValidationSettings struct {
-	// MitigationAction is the mitigation to apply to the operation
-	MitigationAction *string `json:"mitigation_action" url:"-"`
-}
-
-// GetAPIShieldOperationSchemaValidationSettingsParams represents the parameters to pass to retrieve
-// the schema validation settings set on the operation.
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-retrieve-operation-level-settings
-type GetAPIShieldOperationSchemaValidationSettingsParams struct {
-	// The Operation ID to apply the mitigation action to
-	OperationID string `url:"-"`
-}
-
-// UpdateAPIShieldOperationSchemaValidationSettings maps operation IDs to APIShieldOperationSchemaValidationSettings
-//
-// # This can be used to bulk update operations in one call
-//
-// Example:
-//
-//	UpdateAPIShieldOperationSchemaValidationSettings{
-//			"99522293-a505-45e5-bbad-bbc339f5dc40": APIShieldOperationSchemaValidationSettings{ MitigationAction: nil },
-//	}
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-update-multiple-operation-level-settings
-type UpdateAPIShieldOperationSchemaValidationSettings map[string]APIShieldOperationSchemaValidationSettings
-
-// APIShieldOperationSchemaValidationSettingsResponse represents the response from the GET api_gateway/operation/{operationID}/schema_validation endpoint.
-type APIShieldOperationSchemaValidationSettingsResponse struct {
-	Result APIShieldOperationSchemaValidationSettings `json:"result"`
-	Response
-}
-
-// UpdateAPIShieldOperationSchemaValidationSettingsResponse represents the response from the PATCH api_gateway/operations/schema_validation endpoint.
-type UpdateAPIShieldOperationSchemaValidationSettingsResponse struct {
-	Result UpdateAPIShieldOperationSchemaValidationSettings `json:"result"`
-	Response
-}
-
-// GetAPIShieldOperationSchemaValidationSettings retrieves operation level schema validation settings
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-retrieve-operation-level-settings
-func (api *API) GetAPIShieldOperationSchemaValidationSettings(ctx context.Context, rc *ResourceContainer, params GetAPIShieldOperationSchemaValidationSettingsParams) (*APIShieldOperationSchemaValidationSettings, error) {
-	if params.OperationID == "" {
-		return nil, fmt.Errorf("operation ID must be provided")
-	}
-
-	path := fmt.Sprintf("/zones/%s/api_gateway/operations/%s/schema_validation", rc.Identifier, params.OperationID)
-
-	uri := buildURI(path, nil)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, params)
-	if err != nil {
-		return nil, err
-	}
-
-	var asResponse APIShieldOperationSchemaValidationSettingsResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
-
-// UpdateAPIShieldOperationSchemaValidationSettings update multiple operation level schema validation settings
-//
-// API documentation: https://developers.cloudflare.com/api/operations/api-shield-schema-validation-update-multiple-operation-level-settings
-func (api *API) UpdateAPIShieldOperationSchemaValidationSettings(ctx context.Context, rc *ResourceContainer, params UpdateAPIShieldOperationSchemaValidationSettings) (*UpdateAPIShieldOperationSchemaValidationSettings, error) {
-	path := fmt.Sprintf("/zones/%s/api_gateway/operations/schema_validation", rc.Identifier)
-
-	uri := buildURI(path, nil)
-
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
-	if err != nil {
-		return nil, err
-	}
-
-	var asResponse UpdateAPIShieldOperationSchemaValidationSettingsResponse
-	err = json.Unmarshal(res, &asResponse)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return &asResponse.Result, nil
-}
diff --git a/bot_management.go b/bot_management.go
index f77968f45..f44d39ffb 100644
--- a/bot_management.go
+++ b/bot_management.go
@@ -2,10 +2,9 @@ package cloudflare
 
 import (
 	"context"
+	"encoding/json"
 	"fmt"
 	"net/http"
-
-	"github.com/goccy/go-json"
 )
 
 // BotManagement represents the bots config for a zone.
diff --git a/custom_nameservers.go b/custom_nameservers.go
index dda3003c5..95719297c 100644
--- a/custom_nameservers.go
+++ b/custom_nameservers.go
@@ -28,8 +28,9 @@ type CustomNameserverResult struct {
 }
 
 type CustomNameserverZoneMetadata struct {
-	NSSet   int  `json:"ns_set"`
-	Enabled bool `json:"enabled"`
+	Type    string `json:"type"`
+	NSSet   string `json:"ns_set"`
+	Enabled bool   `json:"enabled"`
 }
 
 type customNameserverListResponse struct {
@@ -67,8 +68,9 @@ type GetEligibleZonesAccountCustomNameserversParams struct{}
 type GetCustomNameserverZoneMetadataParams struct{}
 
 type UpdateCustomNameserverZoneMetadataParams struct {
-	NSSet   int  `json:"ns_set"`
-	Enabled bool `json:"enabled"`
+	Type    string `json:"type"`
+	NSSet   string `json:"ns_set"`
+	Enabled bool   `json:"enabled"`
 }
 
 // GetCustomNameservers lists custom nameservers.
@@ -198,6 +200,7 @@ func (api *API) UpdateCustomNameserverZoneMetadata(ctx context.Context, rc *Reso
 
 	uri := fmt.Sprintf("/%s/%s/custom_ns", rc.Level, rc.Identifier)
 
+	params.Type = ""
 	_, err := api.makeRequestContext(ctx, http.MethodPut, uri, params)
 	if err != nil {
 		return err
diff --git a/d1.go b/d1.go
deleted file mode 100644
index 08a3ecc51..000000000
--- a/d1.go
+++ /dev/null
@@ -1,199 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"time"
-
-	"github.com/goccy/go-json"
-)
-
-var (
-	ErrMissingDatabaseID = fmt.Errorf("required missing database ID")
-)
-
-type D1Database struct {
-	Name      string     `json:"name"`
-	NumTables int        `json:"num_tables"`
-	UUID      string     `json:"uuid"`
-	Version   string     `json:"version"`
-	CreatedAt *time.Time `json:"created_at"`
-	FileSize  int64      `json:"file_size"`
-}
-
-type ListD1DatabasesParams struct {
-	Name string `url:"name,omitempty"`
-	ResultInfo
-}
-
-type ListD1Response struct {
-	Result []D1Database `json:"result"`
-	Response
-	ResultInfo `json:"result_info"`
-}
-
-type CreateD1DatabaseParams struct {
-	Name string `json:"name"`
-}
-
-type D1DatabaseResponse struct {
-	Result D1Database `json:"result"`
-	Response
-}
-
-type QueryD1DatabaseParams struct {
-	DatabaseID string   `json:"-"`
-	SQL        string   `json:"sql"`
-	Parameters []string `json:"params"`
-}
-
-type D1DatabaseMetadata struct {
-	ChangedDB   *bool   `json:"changed_db,omitempty"`
-	Changes     int     `json:"changes"`
-	Duration    float64 `json:"duration"`
-	LastRowID   int     `json:"last_row_id"`
-	RowsRead    int     `json:"rows_read"`
-	RowsWritten int     `json:"rows_written"`
-	SizeAfter   int     `json:"size_after"`
-}
-
-type D1Result struct {
-	Success *bool              `json:"success"`
-	Results []map[string]any   `json:"results"`
-	Meta    D1DatabaseMetadata `json:"meta"`
-}
-
-type QueryD1Response struct {
-	Result []D1Result `json:"result"`
-	Response
-}
-
-// ListD1Databases returns all databases for an account.
-//
-// API reference: https://developers.cloudflare.com/api/operations/cloudflare-d1-list-databases
-func (api *API) ListD1Databases(ctx context.Context, rc *ResourceContainer, params ListD1DatabasesParams) ([]D1Database, *ResultInfo, error) {
-	if rc.Identifier == "" {
-		return []D1Database{}, &ResultInfo{}, ErrMissingAccountID
-	}
-	baseURL := fmt.Sprintf("/accounts/%s/d1/database", rc.Identifier)
-	autoPaginate := true
-	if params.PerPage >= 1 || params.Page >= 1 {
-		autoPaginate = false
-	}
-
-	if params.PerPage < 1 {
-		params.PerPage = 100
-	}
-
-	if params.Page < 1 {
-		params.Page = 1
-	}
-	var databases []D1Database
-	var r ListD1Response
-	for {
-		uri := buildURI(baseURL, params)
-		res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-		if err != nil {
-			return []D1Database{}, &ResultInfo{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
-		}
-
-		err = json.Unmarshal(res, &r)
-		if err != nil {
-			return []D1Database{}, &ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-		}
-		databases = append(databases, r.Result...)
-		params.ResultInfo = r.ResultInfo.Next()
-		if params.ResultInfo.Done() || !autoPaginate {
-			break
-		}
-	}
-	return databases, &r.ResultInfo, nil
-}
-
-// CreateD1Database creates a new database for an account.
-//
-// API reference: https://developers.cloudflare.com/api/operations/cloudflare-d1-create-database
-func (api *API) CreateD1Database(ctx context.Context, rc *ResourceContainer, params CreateD1DatabaseParams) (D1Database, error) {
-	if rc.Identifier == "" {
-		return D1Database{}, ErrMissingAccountID
-	}
-	uri := fmt.Sprintf("/accounts/%s/d1/database", rc.Identifier)
-	res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
-	if err != nil {
-		return D1Database{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
-	}
-
-	var r D1DatabaseResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return D1Database{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return r.Result, nil
-}
-
-// DeleteD1Database deletes a database for an account.
-//
-// API reference: https://developers.cloudflare.com/api/operations/cloudflare-d1-delete-database
-func (api *API) DeleteD1Database(ctx context.Context, rc *ResourceContainer, databaseID string) error {
-	if rc.Identifier == "" {
-		return ErrMissingAccountID
-	}
-	if databaseID == "" {
-		return ErrMissingDatabaseID
-	}
-	uri := fmt.Sprintf("/accounts/%s/d1/database/%s", rc.Identifier, databaseID)
-	_, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
-	if err != nil {
-		return fmt.Errorf("%s: %w", errMakeRequestError, err)
-	}
-	return nil
-}
-
-// GetD1Database returns a database for an account.
-//
-// API reference: https://developers.cloudflare.com/api/operations/cloudflare-d1-get-database
-func (api *API) GetD1Database(ctx context.Context, rc *ResourceContainer, databaseID string) (D1Database, error) {
-	if rc.Identifier == "" {
-		return D1Database{}, ErrMissingAccountID
-	}
-	uri := fmt.Sprintf("/accounts/%s/d1/database/%s", rc.Identifier, databaseID)
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return D1Database{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
-	}
-
-	var r D1DatabaseResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return D1Database{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return r.Result, nil
-}
-
-// QueryD1Database queries a database for an account.
-//
-// API reference: https://developers.cloudflare.com/api/operations/cloudflare-d1-query-database
-func (api *API) QueryD1Database(ctx context.Context, rc *ResourceContainer, params QueryD1DatabaseParams) ([]D1Result, error) {
-	if rc.Identifier == "" {
-		return []D1Result{}, ErrMissingAccountID
-	}
-	if params.DatabaseID == "" {
-		return []D1Result{}, ErrMissingDatabaseID
-	}
-	uri := fmt.Sprintf("/accounts/%s/d1/database/%s/query", rc.Identifier, params.DatabaseID)
-	res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
-	if err != nil {
-		return []D1Result{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
-	}
-
-	var r QueryD1Response
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return []D1Result{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return r.Result, nil
-}
diff --git a/devices_policy.go b/devices_policy.go
index c662ecb42..77eaf112d 100644
--- a/devices_policy.go
+++ b/devices_policy.go
@@ -12,8 +12,8 @@ type Enabled struct {
 	Enabled bool `json:"enabled"`
 }
 
-// DeviceClientCertificates identifies if the zero trust zone is configured for an account.
-type DeviceClientCertificates struct {
+// DeviceClientCertificatesZone identifies if the zero trust zone is configured for an account.
+type DeviceClientCertificatesZone struct {
 	Response
 	Result Enabled
 }
@@ -26,8 +26,6 @@ const (
 	proxy          ServiceMode = "proxy"
 	postureOnly    ServiceMode = "posture_only"
 	warpTunnelOnly ServiceMode = "warp_tunnel_only"
-
-	listDeviceSettingsPoliciesDefaultPageSize = 20
 )
 
 type ServiceModeV2 struct {
@@ -69,44 +67,7 @@ type DeleteDeviceSettingsPolicyResponse struct {
 	Result []DeviceSettingsPolicy
 }
 
-type CreateDeviceSettingsPolicyParams struct {
-	DisableAutoFallback *bool          `json:"disable_auto_fallback,omitempty"`
-	CaptivePortal       *int           `json:"captive_portal,omitempty"`
-	AllowModeSwitch     *bool          `json:"allow_mode_switch,omitempty"`
-	SwitchLocked        *bool          `json:"switch_locked,omitempty"`
-	AllowUpdates        *bool          `json:"allow_updates,omitempty"`
-	AutoConnect         *int           `json:"auto_connect,omitempty"`
-	AllowedToLeave      *bool          `json:"allowed_to_leave,omitempty"`
-	SupportURL          *string        `json:"support_url,omitempty"`
-	ServiceModeV2       *ServiceModeV2 `json:"service_mode_v2,omitempty"`
-	Precedence          *int           `json:"precedence,omitempty"`
-	Name                *string        `json:"name,omitempty"`
-	Match               *string        `json:"match,omitempty"`
-	Enabled             *bool          `json:"enabled,omitempty"`
-	ExcludeOfficeIps    *bool          `json:"exclude_office_ips"`
-	Description         *string        `json:"description,omitempty"`
-}
-
-type UpdateDefaultDeviceSettingsPolicyParams struct {
-	DisableAutoFallback *bool          `json:"disable_auto_fallback,omitempty"`
-	CaptivePortal       *int           `json:"captive_portal,omitempty"`
-	AllowModeSwitch     *bool          `json:"allow_mode_switch,omitempty"`
-	SwitchLocked        *bool          `json:"switch_locked,omitempty"`
-	AllowUpdates        *bool          `json:"allow_updates,omitempty"`
-	AutoConnect         *int           `json:"auto_connect,omitempty"`
-	AllowedToLeave      *bool          `json:"allowed_to_leave,omitempty"`
-	SupportURL          *string        `json:"support_url,omitempty"`
-	ServiceModeV2       *ServiceModeV2 `json:"service_mode_v2,omitempty"`
-	Precedence          *int           `json:"precedence,omitempty"`
-	Name                *string        `json:"name,omitempty"`
-	Match               *string        `json:"match,omitempty"`
-	Enabled             *bool          `json:"enabled,omitempty"`
-	ExcludeOfficeIps    *bool          `json:"exclude_office_ips"`
-	Description         *string        `json:"description,omitempty"`
-}
-
-type UpdateDeviceSettingsPolicyParams struct {
-	PolicyID            *string        `json:"-"`
+type DeviceSettingsPolicyRequest struct {
 	DisableAutoFallback *bool          `json:"disable_auto_fallback,omitempty"`
 	CaptivePortal       *int           `json:"captive_portal,omitempty"`
 	AllowModeSwitch     *bool          `json:"allow_mode_switch,omitempty"`
@@ -124,36 +85,14 @@ type UpdateDeviceSettingsPolicyParams struct {
 	Description         *string        `json:"description,omitempty"`
 }
 
-type ListDeviceSettingsPoliciesResponse struct {
-	Response
-	ResultInfo ResultInfo             `json:"result_info"`
-	Result     []DeviceSettingsPolicy `json:"result"`
-}
-
-type UpdateDeviceClientCertificatesParams struct {
-	Enabled *bool `json:"enabled"`
-}
-
-type GetDeviceClientCertificatesParams struct{}
-
-type GetDefaultDeviceSettingsPolicyParams struct{}
-
-type GetDeviceSettingsPolicyParams struct {
-	PolicyID *string `json:"-"`
-}
-
 // UpdateDeviceClientCertificates controls the zero trust zone used to provision client certificates.
 //
 // API reference: https://api.cloudflare.com/#device-client-certificates
-func (api *API) UpdateDeviceClientCertificates(ctx context.Context, rc *ResourceContainer, params UpdateDeviceClientCertificatesParams) (DeviceClientCertificates, error) {
-	if rc.Level != ZoneRouteLevel {
-		return DeviceClientCertificates{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf("/%s/%s/devices/policy/certificates", rc.Level, rc.Identifier)
+func (api *API) UpdateDeviceClientCertificatesZone(ctx context.Context, zoneID string, enable bool) (DeviceClientCertificatesZone, error) {
+	uri := fmt.Sprintf("/%s/%s/devices/policy/certificates", ZoneRouteRoot, zoneID)
 
-	result := DeviceClientCertificates{Result: Enabled{false}}
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
+	result := DeviceClientCertificatesZone{}
+	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, Enabled{enable})
 	if err != nil {
 		return result, err
 	}
@@ -165,18 +104,13 @@ func (api *API) UpdateDeviceClientCertificates(ctx context.Context, rc *Resource
 	return result, err
 }
 
-// GetDeviceClientCertificates controls the zero trust zone used to provision
-// client certificates.
+// GetDeviceClientCertificatesZone controls the zero trust zone used to provision client certificates.
 //
 // API reference: https://api.cloudflare.com/#device-client-certificates
-func (api *API) GetDeviceClientCertificates(ctx context.Context, rc *ResourceContainer, params GetDeviceClientCertificatesParams) (DeviceClientCertificates, error) {
-	if rc.Level != ZoneRouteLevel {
-		return DeviceClientCertificates{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
+func (api *API) GetDeviceClientCertificatesZone(ctx context.Context, zoneID string) (DeviceClientCertificatesZone, error) {
+	uri := fmt.Sprintf("/%s/%s/devices/policy/certificates", ZoneRouteRoot, zoneID)
 
-	uri := fmt.Sprintf("/%s/%s/devices/policy/certificates", rc.Level, rc.Identifier)
-
-	result := DeviceClientCertificates{}
+	result := DeviceClientCertificatesZone{}
 	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
 	if err != nil {
 		return result, err
@@ -189,181 +123,116 @@ func (api *API) GetDeviceClientCertificates(ctx context.Context, rc *ResourceCon
 	return result, err
 }
 
-// CreateDeviceSettingsPolicy creates a settings policy against devices that
-// match the policy.
+// CreateDeviceSettingsPolicy creates a settings policy against devices that match the policy
 //
 // API reference: https://api.cloudflare.com/#devices-create-device-settings-policy
-func (api *API) CreateDeviceSettingsPolicy(ctx context.Context, rc *ResourceContainer, params CreateDeviceSettingsPolicyParams) (DeviceSettingsPolicy, error) {
-	if rc.Level != AccountRouteLevel {
-		return DeviceSettingsPolicy{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf("/%s/%s/devices/policy", rc.Level, rc.Identifier)
+func (api *API) CreateDeviceSettingsPolicy(ctx context.Context, accountID string, req DeviceSettingsPolicyRequest) (DeviceSettingsPolicyResponse, error) {
+	uri := fmt.Sprintf("/%s/%s/devices/policy", AccountRouteRoot, accountID)
 
 	result := DeviceSettingsPolicyResponse{}
-	res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
+	res, err := api.makeRequestContext(ctx, http.MethodPost, uri, req)
 	if err != nil {
-		return DeviceSettingsPolicy{}, err
+		return result, err
 	}
 
 	if err := json.Unmarshal(res, &result); err != nil {
-		return DeviceSettingsPolicy{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
+		return result, fmt.Errorf("%s: %w", errUnmarshalError, err)
 	}
 
-	return result.Result, err
+	return result, err
 }
 
 // UpdateDefaultDeviceSettingsPolicy updates the default settings policy for an account
 //
 // API reference: https://api.cloudflare.com/#devices-update-default-device-settings-policy
-func (api *API) UpdateDefaultDeviceSettingsPolicy(ctx context.Context, rc *ResourceContainer, params UpdateDefaultDeviceSettingsPolicyParams) (DeviceSettingsPolicy, error) {
-	if rc.Level != AccountRouteLevel {
-		return DeviceSettingsPolicy{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
+func (api *API) UpdateDefaultDeviceSettingsPolicy(ctx context.Context, accountID string, req DeviceSettingsPolicyRequest) (DeviceSettingsPolicyResponse, error) {
 	result := DeviceSettingsPolicyResponse{}
-	uri := fmt.Sprintf("/%s/%s/devices/policy", rc.Level, rc.Identifier)
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
+	uri := fmt.Sprintf("/%s/%s/devices/policy", AccountRouteRoot, accountID)
+	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, req)
 	if err != nil {
-		return DeviceSettingsPolicy{}, err
+		return result, err
 	}
 
 	if err := json.Unmarshal(res, &result); err != nil {
-		return DeviceSettingsPolicy{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
+		return result, fmt.Errorf("%s: %w", errUnmarshalError, err)
 	}
 
-	return result.Result, err
+	return result, err
 }
 
 // UpdateDeviceSettingsPolicy updates a settings policy
 //
 // API reference: https://api.cloudflare.com/#devices-update-device-settings-policy
-func (api *API) UpdateDeviceSettingsPolicy(ctx context.Context, rc *ResourceContainer, params UpdateDeviceSettingsPolicyParams) (DeviceSettingsPolicy, error) {
-	if rc.Level != AccountRouteLevel {
-		return DeviceSettingsPolicy{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf("/%s/%s/devices/policy/%s", rc.Level, rc.Identifier, *params.PolicyID)
+func (api *API) UpdateDeviceSettingsPolicy(ctx context.Context, accountID, policyID string, req DeviceSettingsPolicyRequest) (DeviceSettingsPolicyResponse, error) {
+	uri := fmt.Sprintf("/%s/%s/devices/policy/%s", AccountRouteRoot, accountID, policyID)
 
 	result := DeviceSettingsPolicyResponse{}
-	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
+	res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, req)
 	if err != nil {
-		return DeviceSettingsPolicy{}, err
+		return result, err
 	}
 
 	if err := json.Unmarshal(res, &result); err != nil {
-		return DeviceSettingsPolicy{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
+		return result, fmt.Errorf("%s: %w", errUnmarshalError, err)
 	}
 
-	return result.Result, err
+	return result, err
 }
 
 // DeleteDeviceSettingsPolicy deletes a settings policy and returns a list
-// of all of the other policies in the account.
+// of all of the other policies in the account
 //
 // API reference: https://api.cloudflare.com/#devices-delete-device-settings-policy
-func (api *API) DeleteDeviceSettingsPolicy(ctx context.Context, rc *ResourceContainer, policyID string) ([]DeviceSettingsPolicy, error) {
-	if rc.Level != AccountRouteLevel {
-		return []DeviceSettingsPolicy{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf("/%s/%s/devices/policy/%s", rc.Level, rc.Identifier, policyID)
+func (api *API) DeleteDeviceSettingsPolicy(ctx context.Context, accountID, policyID string) (DeleteDeviceSettingsPolicyResponse, error) {
+	uri := fmt.Sprintf("/%s/%s/devices/policy/%s", AccountRouteRoot, accountID, policyID)
 
 	result := DeleteDeviceSettingsPolicyResponse{}
 	res, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
 	if err != nil {
-		return []DeviceSettingsPolicy{}, err
+		return result, err
 	}
 
 	if err := json.Unmarshal(res, &result); err != nil {
-		return []DeviceSettingsPolicy{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
+		return result, fmt.Errorf("%s: %w", errUnmarshalError, err)
 	}
 
-	return result.Result, err
+	return result, err
 }
 
-// GetDefaultDeviceSettings gets the default device settings policy.
+// GetDefaultDeviceSettings gets the default device settings policy
 //
 // API reference: https://api.cloudflare.com/#devices-get-default-device-settings-policy
-func (api *API) GetDefaultDeviceSettingsPolicy(ctx context.Context, rc *ResourceContainer, params GetDefaultDeviceSettingsPolicyParams) (DeviceSettingsPolicy, error) {
-	if rc.Level != AccountRouteLevel {
-		return DeviceSettingsPolicy{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf("/%s/%s/devices/policy", rc.Level, rc.Identifier)
+func (api *API) GetDefaultDeviceSettingsPolicy(ctx context.Context, accountID string) (DeviceSettingsPolicyResponse, error) {
+	uri := fmt.Sprintf("/%s/%s/devices/policy", AccountRouteRoot, accountID)
 
 	result := DeviceSettingsPolicyResponse{}
 	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
 	if err != nil {
-		return DeviceSettingsPolicy{}, err
+		return result, err
 	}
 
 	if err := json.Unmarshal(res, &result); err != nil {
-		return DeviceSettingsPolicy{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
+		return result, fmt.Errorf("%s: %w", errUnmarshalError, err)
 	}
 
-	return result.Result, err
+	return result, err
 }
 
-// GetDefaultDeviceSettings gets the device settings policy by its policyID.
+// GetDefaultDeviceSettings gets the device settings policy by its policyID
 //
 // API reference: https://api.cloudflare.com/#devices-get-device-settings-policy-by-id
-func (api *API) GetDeviceSettingsPolicy(ctx context.Context, rc *ResourceContainer, params GetDeviceSettingsPolicyParams) (DeviceSettingsPolicy, error) {
-	if rc.Level != AccountRouteLevel {
-		return DeviceSettingsPolicy{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf("/%s/%s/devices/policy/%s", rc.Level, rc.Identifier, *params.PolicyID)
+func (api *API) GetDeviceSettingsPolicy(ctx context.Context, accountID, policyID string) (DeviceSettingsPolicyResponse, error) {
+	uri := fmt.Sprintf("/%s/%s/devices/policy/%s", AccountRouteRoot, accountID, policyID)
 
 	result := DeviceSettingsPolicyResponse{}
 	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
 	if err != nil {
-		return DeviceSettingsPolicy{}, err
+		return result, err
 	}
 
 	if err := json.Unmarshal(res, &result); err != nil {
-		return DeviceSettingsPolicy{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return result.Result, err
-}
-
-type ListDeviceSettingsPoliciesParams struct {
-	ResultInfo
-}
-
-// ListDeviceSettingsPolicies returns all device settings policies for an account
-//
-// API reference: https://api.cloudflare.com/#devices-list-device-settings-policies
-func (api *API) ListDeviceSettingsPolicies(ctx context.Context, rc *ResourceContainer, params ListDeviceSettingsPoliciesParams) ([]DeviceSettingsPolicy, *ResultInfo, error) {
-	autoPaginate := true
-	if params.PerPage >= 1 || params.Page >= 1 {
-		autoPaginate = false
-	}
-
-	if params.PerPage < 1 {
-		params.PerPage = listDeviceSettingsPoliciesDefaultPageSize
+		return result, fmt.Errorf("%s: %w", errUnmarshalError, err)
 	}
 
-	var policies []DeviceSettingsPolicy
-	var lastResultInfo ResultInfo
-	for {
-		uri := buildURI(fmt.Sprintf("/%s/%s/devices/policies", rc.Level, rc.Identifier), params)
-		res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-		if err != nil {
-			return nil, nil, err
-		}
-		var r ListDeviceSettingsPoliciesResponse
-		err = json.Unmarshal(res, &r)
-		if err != nil {
-			return nil, nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-		}
-		policies = append(policies, r.Result...)
-		lastResultInfo = r.ResultInfo
-		params.ResultInfo = r.ResultInfo.Next()
-		if params.ResultInfo.Done() || !autoPaginate {
-			break
-		}
-	}
-	return policies, &lastResultInfo, nil
+	return result, err
 }
diff --git a/go.mod b/go.mod
index 5afad2f29..21654d9e1 100644
--- a/go.mod
+++ b/go.mod
@@ -9,8 +9,8 @@ require (
 	github.com/olekukonko/tablewriter v0.0.5
 	github.com/stretchr/testify v1.8.4
 	github.com/urfave/cli/v2 v2.25.7
-	golang.org/x/net v0.17.0
-	golang.org/x/time v0.4.0
+	golang.org/x/net v0.15.0
+	golang.org/x/time v0.3.0
 )
 
 require gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
diff --git a/go.sum b/go.sum
index 15dcb0447..bf34d5de3 100644
--- a/go.sum
+++ b/go.sum
@@ -59,19 +59,19 @@ github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
 github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
 github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
 github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
+golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
 golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
 golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY=
-golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/internal/tools/go.mod b/internal/tools/go.mod
index b0c02ca79..eb343b706 100644
--- a/internal/tools/go.mod
+++ b/internal/tools/go.mod
@@ -219,15 +219,15 @@ require (
 	go.uber.org/multierr v1.6.0 // indirect
 	go.uber.org/zap v1.17.0 // indirect
 	golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4 // indirect
-	golang.org/x/crypto v0.14.0 // indirect
+	golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
 	golang.org/x/exp/typeparams v0.0.0-20220722155223-a9213eeb770e // indirect
-	golang.org/x/mod v0.8.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sync v0.1.0 // indirect
-	golang.org/x/sys v0.13.0 // indirect
-	golang.org/x/text v0.13.0 // indirect
+	golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
+	golang.org/x/net v0.7.0 // indirect
+	golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
+	golang.org/x/sys v0.5.0 // indirect
+	golang.org/x/text v0.7.0 // indirect
 	golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect
-	golang.org/x/tools v0.6.0 // indirect
+	golang.org/x/tools v0.1.13-0.20220812184215-3f9b119300de // indirect
 	golang.org/x/vuln v0.0.0-20220725105440-4151a5aca1df // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
diff --git a/internal/tools/go.sum b/internal/tools/go.sum
index 766cd8d67..aeb2689f0 100644
--- a/internal/tools/go.sum
+++ b/internal/tools/go.sum
@@ -917,8 +917,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/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.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
-golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -959,9 +959,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
 golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1006,8 +1005,8 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+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/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1031,8 +1030,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1104,10 +1103,10 @@ golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
-golang.org/x/sys v0.13.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.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
+golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1117,8 +1116,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
-golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1211,8 +1210,8 @@ golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlz
 golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
 golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
 golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
-golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
-golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.1.13-0.20220812184215-3f9b119300de h1:b68wxF4nfQjj1XTRHtjVjCximbhAwjztuzDEFGU+n9o=
+golang.org/x/tools v0.1.13-0.20220812184215-3f9b119300de/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools/gopls v0.9.4 h1:YhHOxVi++ILnY+QnH9FGtRKZZrunSaR7OW8/dCp7bBk=
 golang.org/x/tools/gopls v0.9.4/go.mod h1:merWH6UwxKhBcAlppWCEC4kJDvHxmHdKNDftyHnMsjU=
 golang.org/x/vuln v0.0.0-20220725105440-4151a5aca1df h1:BkeW9/QJhcigekDUPS9N9bIb0v7gPKKmLYeczVAqr2s=
diff --git a/list.go b/list.go
index f7cef4aca..e7893c352 100644
--- a/list.go
+++ b/list.go
@@ -177,10 +177,7 @@ type ListDeleteParams struct {
 }
 
 type ListListItemsParams struct {
-	ID      string `url:"-"`
-	Search  string `url:"search,omitempty"`
-	PerPage int    `url:"per_page,omitempty"`
-	Cursor  string `url:"cursor,omitempty"`
+	ID string
 }
 
 type ListCreateItemsParams struct {
@@ -339,10 +336,14 @@ func (api *API) DeleteList(ctx context.Context, rc *ResourceContainer, listID st
 // API reference: https://api.cloudflare.com/#rules-lists-list-list-items
 func (api *API) ListListItems(ctx context.Context, rc *ResourceContainer, params ListListItemsParams) ([]ListItem, error) {
 	var list []ListItem
+	var cursor string
+	var cursorQuery string
 
 	for {
-		uri := buildURI(fmt.Sprintf("/accounts/%s/rules/lists/%s/items", rc.Identifier, params.ID), params)
-
+		if len(cursor) > 0 {
+			cursorQuery = fmt.Sprintf("?cursor=%s", cursor)
+		}
+		uri := fmt.Sprintf("/accounts/%s/rules/lists/%s/items%s", rc.Identifier, params.ID, cursorQuery)
 		res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
 		if err != nil {
 			return []ListItem{}, err
@@ -354,10 +355,8 @@ func (api *API) ListListItems(ctx context.Context, rc *ResourceContainer, params
 		}
 
 		list = append(list, result.Result...)
-		if cursor := result.ResultInfo.Cursors.After; cursor == "" {
+		if cursor = result.ResultInfo.Cursors.After; cursor == "" {
 			break
-		} else {
-			params.Cursor = cursor
 		}
 	}
 
diff --git a/load_balancing.go b/load_balancing.go
index ad59b5c7f..8acf121fd 100644
--- a/load_balancing.go
+++ b/load_balancing.go
@@ -43,8 +43,6 @@ type LoadBalancerOrigin struct {
 	//
 	// When LoadBalancerOriginSteering.Policy="least_outstanding_requests", this
 	// weight is used to scale the origin's outstanding requests.
-	// When LoadBalancerOriginSteering.Policy="least_connections", this
-	// weight is used to scale the origin's open connections.
 	Weight float64             `json:"weight"`
 	Header map[string][]string `json:"header"`
 }
@@ -61,10 +59,6 @@ type LoadBalancerOriginSteering struct {
 	// "least_outstanding_requests": Select an origin by taking into consideration origin weights,
 	// as well as each origin's number of outstanding requests. Origins with more pending requests
 	// are weighted proportionately less relative to others.
-	//
-	// "least_connections": Select an origin by taking into consideration origin weights,
-	// as well as each origin's number of open connections. Origins with more open connections
-	// are weighted proportionately less relative to others. Supported for HTTP/1 and HTTP/2 connections.
 	Policy string `json:"policy,omitempty"`
 }
 
@@ -133,11 +127,6 @@ type LoadBalancer struct {
 	// RandomSteering weights, as well as each pool's number of outstanding requests.
 	// Pools with more pending requests are weighted proportionately less relative to others.
 	//
-	// "least_connections": Select a pool by taking into consideration
-	// RandomSteering weights, as well as each pool's number of open connections.
-	// Pools with more open connections are weighted proportionately less relative to others.
-	// Supported for HTTP/1 and HTTP/2 connections.
-	//
 	// "": Maps to "geo" if RegionPools or PopPools or CountryPools have entries otherwise "off".
 	SteeringPolicy string `json:"steering_policy,omitempty"`
 }
@@ -218,9 +207,6 @@ type LoadBalancerRuleOverrides struct {
 //
 // SteeringPolicy="least_outstanding_requests": Use pool weights to
 // scale each pool's outstanding requests.
-//
-// SteeringPolicy="least_connections": Use pool weights to
-// scale each pool's open connections.
 type RandomSteering struct {
 	DefaultWeight float64            `json:"default_weight,omitempty"`
 	PoolWeights   map[string]float64 `json:"pool_weights,omitempty"`
diff --git a/observatory.go b/observatory.go
deleted file mode 100644
index d1f7d08ed..000000000
--- a/observatory.go
+++ /dev/null
@@ -1,401 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"errors"
-	"fmt"
-	"net/http"
-	"net/url"
-	"time"
-
-	"github.com/goccy/go-json"
-	"github.com/google/go-querystring/query"
-)
-
-var (
-	ErrMissingObservatoryUrl    = errors.New("missing required page url")
-	ErrMissingObservatoryTestID = errors.New("missing required test id")
-)
-
-// ObservatoryPage describes all the tests for a web page.
-type ObservatoryPage struct {
-	URL               string                `json:"url"`
-	Region            labeledRegion         `json:"region"`
-	ScheduleFrequency string                `json:"scheduleFrequency"`
-	Tests             []ObservatoryPageTest `json:"tests"`
-}
-
-// ObservatoryPageTest describes a single test for a web page.
-type ObservatoryPageTest struct {
-	ID                string                      `json:"id"`
-	Date              *time.Time                  `json:"date"`
-	URL               string                      `json:"url"`
-	Region            labeledRegion               `json:"region"`
-	ScheduleFrequency *string                     `json:"scheduleFrequency"`
-	MobileReport      ObservatoryLighthouseReport `json:"mobileReport"`
-	DesktopReport     ObservatoryLighthouseReport `json:"desktopReport"`
-}
-
-// labeledRegion describes a region the test was run in.
-type labeledRegion struct {
-	Value string `json:"value"`
-	Label string `json:"label"`
-}
-
-// ObservatorySchedule describe a test schedule.
-type ObservatorySchedule struct {
-	URL       string `json:"url"`
-	Region    string `json:"region"`
-	Frequency string `json:"frequency"`
-}
-
-// ObservatoryLighthouseReport describes the web vital metrics result.
-type ObservatoryLighthouseReport struct {
-	PerformanceScore int    `json:"performanceScore"`
-	State            string `json:"state"`
-	DeviceType       string `json:"deviceType"`
-	// TTFB is time to first byte
-	TTFB int `json:"ttfb"`
-	// FCP is first contentful paint
-	FCP int `json:"fcp"`
-	// LCP is largest contentful pain
-	LCP int `json:"lcp"`
-	// TTI is time to interactive
-	TTI int `json:"tti"`
-	// TBT is total blocking time
-	TBT int `json:"tbt"`
-	// SI is speed index
-	SI int `json:"si"`
-	// CLS is cumulative layout shift
-	CLS   float64          `json:"cls"`
-	Error *lighthouseError `json:"error,omitempty"`
-}
-
-// lighthouseError describes the test error.
-type lighthouseError struct {
-	Code              string `json:"code"`
-	Detail            string `json:"detail"`
-	FinalDisplayedURL string `json:"finalDisplayedUrl"`
-}
-
-// ObservatoryPageTrend describes the web vital metrics trend.
-type ObservatoryPageTrend struct {
-	PerformanceScore []*int     `json:"performanceScore"`
-	TTFB             []*int     `json:"ttfb"`
-	FCP              []*int     `json:"fcp"`
-	LCP              []*int     `json:"lcp"`
-	TTI              []*int     `json:"tti"`
-	TBT              []*int     `json:"tbt"`
-	SI               []*int     `json:"si"`
-	CLS              []*float64 `json:"cls"`
-}
-
-type ListObservatoryPagesParams struct {
-}
-
-// ObservatoryPagesResponse is the API response, containing a list of ObservatoryPage.
-type ObservatoryPagesResponse struct {
-	Response
-	Result []ObservatoryPage `json:"result"`
-}
-
-// ListObservatoryPages returns a list of pages which have been tested.
-//
-// API reference: https://api.cloudflare.com/#speed-list-pages
-func (api *API) ListObservatoryPages(ctx context.Context, rc *ResourceContainer, params ListObservatoryPagesParams) ([]ObservatoryPage, error) {
-	uri := fmt.Sprintf("/zones/%s/speed_api/pages", rc.Identifier)
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-	var r ObservatoryPagesResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-	return r.Result, nil
-}
-
-type GetObservatoryPageTrendParams struct {
-	URL        string     `url:"-"`
-	Region     string     `url:"region"`
-	DeviceType string     `url:"deviceType"`
-	Start      *time.Time `url:"start"`
-	End        *time.Time `url:"end,omitempty"`
-	Timezone   string     `url:"tz"`
-	Metrics    []string   `url:"metrics"`
-}
-
-type ObservatoryPageTrendResponse struct {
-	Response
-	Result ObservatoryPageTrend `json:"result"`
-}
-
-// GetObservatoryPageTrend returns a the trend of web vital metrics for a page in a specific region.
-//
-// API reference: https://api.cloudflare.com/#speed-list-page-trend
-func (api *API) GetObservatoryPageTrend(ctx context.Context, rc *ResourceContainer, params GetObservatoryPageTrendParams) (*ObservatoryPageTrend, error) {
-	if params.URL == "" {
-		return nil, ErrMissingObservatoryUrl
-	}
-	// cannot use buildURI because params.URL contains "/" that should be encoded and buildURI will double encode %2F into %252F
-	v, _ := query.Values(params)
-	uri := fmt.Sprintf("/zones/%s/speed_api/pages/%s/trend?%s", rc.Identifier, url.PathEscape(params.URL), v.Encode())
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-	var r ObservatoryPageTrendResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-	return &r.Result, nil
-}
-
-var listObservatoryPageTestDefaultPageSize = 20
-
-type ListObservatoryPageTestParams struct {
-	URL    string `url:"-"`
-	Region string `url:"region"`
-	ResultInfo
-}
-
-type ObservatoryPageTestsResponse struct {
-	Response
-	Result     []ObservatoryPageTest `json:"result"`
-	ResultInfo `json:"result_info"`
-}
-
-// ListObservatoryPageTests returns a list of tests for a page in a specific region.
-//
-// API reference: https://api.cloudflare.com/#speed-list-test-history
-func (api *API) ListObservatoryPageTests(ctx context.Context, rc *ResourceContainer, params ListObservatoryPageTestParams) ([]ObservatoryPageTest, *ResultInfo, error) {
-	if params.URL == "" {
-		return nil, nil, ErrMissingObservatoryUrl
-	}
-	autoPaginate := true
-	if params.PerPage >= 1 || params.Page >= 1 {
-		autoPaginate = false
-	}
-	if params.PerPage < 1 {
-		params.PerPage = listObservatoryPageTestDefaultPageSize
-	}
-	if params.Page < 1 {
-		params.Page = 1
-	}
-	var tests []ObservatoryPageTest
-	var lastResultInfo ResultInfo
-	for {
-		// cannot use buildURI because params.URL contains "/" that should be encoded and buildURI will double encode %2F into %252F
-		v, _ := query.Values(params)
-		uri := fmt.Sprintf("/zones/%s/speed_api/pages/%s/tests?%s", rc.Identifier, url.PathEscape(params.URL), v.Encode())
-		res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-		if err != nil {
-			return nil, nil, err
-		}
-		var r ObservatoryPageTestsResponse
-		err = json.Unmarshal(res, &r)
-		if err != nil {
-			return nil, nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-		}
-		tests = append(tests, r.Result...)
-		lastResultInfo = r.ResultInfo.Next()
-		if params.ResultInfo.Done() || !autoPaginate {
-			break
-		}
-	}
-	return tests, &lastResultInfo, nil
-}
-
-type CreateObservatoryPageTestParams struct {
-	URL      string
-	Settings CreateObservatoryPageTestSettings
-}
-type CreateObservatoryPageTestSettings struct {
-	Region string `json:"region"`
-}
-
-type ObservatoryPageTestResponse struct {
-	Response
-	Result ObservatoryPageTest `json:"result"`
-}
-
-// CreateObservatoryPageTest starts a test for a page in a specific region.
-//
-// API reference: https://api.cloudflare.com/#speed-create-test
-func (api *API) CreateObservatoryPageTest(ctx context.Context, rc *ResourceContainer, params CreateObservatoryPageTestParams) (*ObservatoryPageTest, error) {
-	if params.URL == "" {
-		return nil, ErrMissingObservatoryUrl
-	}
-	uri := fmt.Sprintf("/zones/%s/speed_api/pages/%s/tests", rc.Identifier, url.PathEscape(params.URL))
-	res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params.Settings)
-	if err != nil {
-		return nil, err
-	}
-	var r ObservatoryPageTestResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-	return &r.Result, nil
-}
-
-type DeleteObservatoryPageTestsParams struct {
-	URL    string `url:"-"`
-	Region string `url:"region"`
-}
-
-type ObservatoryCountResponse struct {
-	Response
-	Result struct {
-		Count int `json:"count"`
-	} `json:"result"`
-}
-
-// DeleteObservatoryPageTests deletes all tests for a page in a specific region.
-//
-// API reference: https://api.cloudflare.com/#speed-delete-tests
-func (api *API) DeleteObservatoryPageTests(ctx context.Context, rc *ResourceContainer, params DeleteObservatoryPageTestsParams) (*int, error) {
-	if params.URL == "" {
-		return nil, ErrMissingObservatoryUrl
-	}
-	// cannot use buildURI because params.URL contains "/" that should be encoded and buildURI will double encode %2F into %252F
-	v, _ := query.Values(params)
-	uri := fmt.Sprintf("/zones/%s/speed_api/pages/%s/tests?%s", rc.Identifier, url.PathEscape(params.URL), v.Encode())
-	res, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-	var r ObservatoryCountResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-	return &r.Result.Count, nil
-}
-
-type GetObservatoryPageTestParams struct {
-	URL    string
-	TestID string
-}
-
-// GetObservatoryPageTest returns a specific test for a page.
-//
-// API reference: https://api.cloudflare.com/#speed-get-test
-func (api *API) GetObservatoryPageTest(ctx context.Context, rc *ResourceContainer, params GetObservatoryPageTestParams) (*ObservatoryPageTest, error) {
-	if params.URL == "" {
-		return nil, ErrMissingObservatoryUrl
-	}
-	if params.TestID == "" {
-		return nil, ErrMissingObservatoryTestID
-	}
-	uri := fmt.Sprintf("/zones/%s/speed_api/pages/%s/tests/%s", rc.Identifier, url.PathEscape(params.URL), params.TestID)
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-	var r ObservatoryPageTestResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-	return &r.Result, nil
-}
-
-type CreateObservatoryScheduledPageTestParams struct {
-	URL       string `url:"-" json:"-"`
-	Region    string `url:"region" json:"-"`
-	Frequency string `url:"frequency" json:"-"`
-}
-
-type ObservatoryScheduledPageTest struct {
-	Schedule ObservatorySchedule `json:"schedule"`
-	Test     ObservatoryPageTest `json:"test"`
-}
-
-type CreateObservatoryScheduledPageTestResponse struct {
-	Response
-	Result ObservatoryScheduledPageTest `json:"result"`
-}
-
-// CreateObservatoryScheduledPageTest creates a scheduled test for a page in a specific region.
-//
-// API reference: https://api.cloudflare.com/#speed-create-scheduled-test
-func (api *API) CreateObservatoryScheduledPageTest(ctx context.Context, rc *ResourceContainer, params CreateObservatoryScheduledPageTestParams) (*ObservatoryScheduledPageTest, error) {
-	if params.URL == "" {
-		return nil, ErrMissingObservatoryUrl
-	}
-	// cannot use buildURI because params.URL contains "/" that should be encoded and buildURI will double encode %2F into %252F
-	v, _ := query.Values(params)
-	uri := fmt.Sprintf("/zones/%s/speed_api/schedule/%s?%s", rc.Identifier, url.PathEscape(params.URL), v.Encode())
-	res, err := api.makeRequestContext(ctx, http.MethodPost, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-	var r CreateObservatoryScheduledPageTestResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-	return &r.Result, nil
-}
-
-type GetObservatoryScheduledPageTestParams struct {
-	URL    string `url:"-"`
-	Region string `url:"region"`
-}
-
-type ObservatoryScheduleResponse struct {
-	Response
-	Result ObservatorySchedule `json:"result"`
-}
-
-// GetObservatoryScheduledPageTest returns the test schedule for a page in a specific region.
-//
-// API reference: https://api.cloudflare.com/#speed-get-scheduled-test
-func (api *API) GetObservatoryScheduledPageTest(ctx context.Context, rc *ResourceContainer, params GetObservatoryScheduledPageTestParams) (*ObservatorySchedule, error) {
-	if params.URL == "" {
-		return nil, ErrMissingObservatoryUrl
-	}
-	// cannot use buildURI because params.URL contains "/" that should be encoded and buildURI will double encode %2F into %252F
-	v, _ := query.Values(params)
-	uri := fmt.Sprintf("/zones/%s/speed_api/schedule/%s?%s", rc.Identifier, url.PathEscape(params.URL), v.Encode())
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-	var r ObservatoryScheduleResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-	return &r.Result, nil
-}
-
-type DeleteObservatoryScheduledPageTestParams struct {
-	URL    string `url:"-"`
-	Region string `url:"region"`
-}
-
-// DeleteObservatoryScheduledPageTest deletes the test schedule for a page in a specific region.
-//
-// API reference: https://api.cloudflare.com/#speed-delete-scheduled-test
-func (api *API) DeleteObservatoryScheduledPageTest(ctx context.Context, rc *ResourceContainer, params DeleteObservatoryScheduledPageTestParams) (*int, error) {
-	if params.URL == "" {
-		return nil, ErrMissingObservatoryUrl
-	}
-	// cannot use buildURI because params.URL contains "/" that should be encoded and buildURI will double encode %2F into %252F
-	v, _ := query.Values(params)
-	uri := fmt.Sprintf("/zones/%s/speed_api/schedule/%s?%s", rc.Identifier, url.PathEscape(params.URL), v.Encode())
-	res, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
-	if err != nil {
-		return nil, err
-	}
-	var r ObservatoryCountResponse
-	err = json.Unmarshal(res, &r)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-	return &r.Result.Count, nil
-}
diff --git a/per_hostname_tls_settings.go b/per_hostname_tls_settings.go
index 74b3ce73f..26beec884 100644
--- a/per_hostname_tls_settings.go
+++ b/per_hostname_tls_settings.go
@@ -2,12 +2,11 @@ package cloudflare
 
 import (
 	"context"
+	"encoding/json"
 	"errors"
 	"fmt"
 	"net/http"
 	"time"
-
-	"github.com/goccy/go-json"
 )
 
 // HostnameTLSSetting represents the metadata for a user-created tls setting.
diff --git a/teams_accounts.go b/teams_accounts.go
index 15665e04f..db63f0538 100644
--- a/teams_accounts.go
+++ b/teams_accounts.go
@@ -44,12 +44,10 @@ type TeamsAccountSettings struct {
 	BrowserIsolation  *BrowserIsolation       `json:"browser_isolation,omitempty"`
 	FIPS              *TeamsFIPS              `json:"fips,omitempty"`
 	ProtocolDetection *TeamsProtocolDetection `json:"protocol_detection,omitempty"`
-	BodyScanning      *TeamsBodyScanning      `json:"body_scanning,omitempty"`
 }
 
 type BrowserIsolation struct {
-	UrlBrowserIsolationEnabled *bool `json:"url_browser_isolation_enabled,omitempty"`
-	NonIdentityEnabled         *bool `json:"non_identity_enabled,omitempty"`
+	UrlBrowserIsolationEnabled bool `json:"url_browser_isolation_enabled"`
 }
 
 type TeamsAntivirus struct {
@@ -86,17 +84,6 @@ type TeamsBlockPage struct {
 	SuppressFooter  *bool  `json:"suppress_footer,omitempty"`
 }
 
-type TeamsInspectionMode = string
-
-const (
-	TeamsShallowInspectionMode TeamsInspectionMode = "shallow"
-	TeamsDeepInspectionMode    TeamsInspectionMode = "deep"
-)
-
-type TeamsBodyScanning struct {
-	InspectionMode TeamsInspectionMode `json:"inspection_mode,omitempty"`
-}
-
 type TeamsRuleType = string
 
 const (
diff --git a/teams_audit_ssh_settings.go b/teams_audit_ssh_settings.go
deleted file mode 100644
index a4ec1e320..000000000
--- a/teams_audit_ssh_settings.go
+++ /dev/null
@@ -1,86 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"time"
-
-	"github.com/goccy/go-json"
-)
-
-// TeamsList represents a Teams List.
-type AuditSSHSettings struct {
-	PublicKey string     `json:"public_key"`
-	SeedUUID  string     `json:"seed_id"`
-	CreatedAt *time.Time `json:"created_at"`
-	UpdatedAt *time.Time `json:"updated_at"`
-}
-
-type AuditSSHSettingsResponse struct {
-	Result AuditSSHSettings `json:"result"`
-	Response
-	ResultInfo `json:"result_info"`
-}
-
-type GetAuditSSHSettingsParams struct{}
-
-type UpdateAuditSSHSettingsParams struct {
-	PublicKey string `json:"public_key"`
-}
-
-// GetAuditSSHSettings returns the accounts zt audit ssh settings.
-//
-// API reference: https://api.cloudflare.com/#zero-trust-get-audit-ssh-settings
-func (api *API) GetAuditSSHSettings(ctx context.Context, rc *ResourceContainer, params GetAuditSSHSettingsParams) (AuditSSHSettings, ResultInfo, error) {
-	if rc.Level != AccountRouteLevel {
-		return AuditSSHSettings{}, ResultInfo{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	uri := fmt.Sprintf("/%s/%s/gateway/audit_ssh_settings", rc.Level, rc.Identifier)
-
-	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
-	if err != nil {
-		return AuditSSHSettings{}, ResultInfo{}, err
-	}
-
-	var auditSSHSettingsResponse AuditSSHSettingsResponse
-	err = json.Unmarshal(res, &auditSSHSettingsResponse)
-	if err != nil {
-		return AuditSSHSettings{}, ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return auditSSHSettingsResponse.Result, auditSSHSettingsResponse.ResultInfo, nil
-}
-
-// UpdateAuditSSHSettings updates an existing zt audit ssh setting.
-//
-// API reference: https://api.cloudflare.com/#zero-trust-update-audit-ssh-settings
-func (api *API) UpdateAuditSSHSettings(ctx context.Context, rc *ResourceContainer, params UpdateAuditSSHSettingsParams) (AuditSSHSettings, error) {
-	if rc.Level != AccountRouteLevel {
-		return AuditSSHSettings{}, fmt.Errorf(errInvalidResourceContainerAccess, rc.Level)
-	}
-
-	if rc.Identifier == "" {
-		return AuditSSHSettings{}, ErrMissingAccountID
-	}
-
-	uri := fmt.Sprintf(
-		"/%s/%s/gateway/audit_ssh_settings",
-		rc.Level,
-		rc.Identifier,
-	)
-
-	res, err := api.makeRequestContext(ctx, http.MethodPut, uri, params)
-	if err != nil {
-		return AuditSSHSettings{}, err
-	}
-
-	var auditSSHSettingsResponse AuditSSHSettingsResponse
-	err = json.Unmarshal(res, &auditSSHSettingsResponse)
-	if err != nil {
-		return AuditSSHSettings{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
-	}
-
-	return auditSSHSettingsResponse.Result, nil
-}
diff --git a/teams_rules.go b/teams_rules.go
index eaa5e8bba..f179e81c6 100644
--- a/teams_rules.go
+++ b/teams_rules.go
@@ -57,6 +57,12 @@ type TeamsRuleSettings struct {
 
 	// Action taken when an untrusted origin certificate error occurs in a http allow rule
 	UntrustedCertSettings *UntrustedCertSettings `json:"untrusted_cert"`
+
+	// Specifies that a resolver policy should use Cloudflare's DNS Resolver.
+	ResolveDnsThroughCloudflare *bool `json:"resolve_dns_through_cloudflare,omitempty"`
+
+	// Resolver policy settings.
+	DnsResolverSettings *TeamsDnsResolverSettings `json:"dns_resolvers,omitempty"`
 }
 
 type TeamsGatewayUntrustedCertAction string
@@ -101,6 +107,28 @@ type TeamsCheckSessionSettings struct {
 	Duration Duration `json:"duration"`
 }
 
+type (
+	TeamsDnsResolverSettings struct {
+		V4Resolvers []TeamsDnsResolverAddressV4 `json:"ipv4,omitempty"`
+		V6Resolvers []TeamsDnsResolverAddressV6 `json:"ipv6,omitempty"`
+	}
+
+	TeamsDnsResolverAddressV4 struct {
+		TeamsDnsResolverAddress
+	}
+
+	TeamsDnsResolverAddressV6 struct {
+		TeamsDnsResolverAddress
+	}
+
+	TeamsDnsResolverAddress struct {
+		IP                         string `json:"ip"`
+		Port                       *int   `json:"port,omitempty"`
+		VnetID                     string `json:"vnet_id,omitempty"`
+		RouteThroughPrivateNetwork *bool  `json:"route_through_private_network,omitempty"`
+	}
+)
+
 type TeamsDlpPayloadLogSettings struct {
 	Enabled bool `json:"enabled"`
 }
diff --git a/web_analytics.go b/web_analytics.go
index 9f3041f1a..40e6d1bde 100644
--- a/web_analytics.go
+++ b/web_analytics.go
@@ -2,12 +2,11 @@ package cloudflare
 
 import (
 	"context"
+	"encoding/json"
 	"errors"
 	"fmt"
 	"net/http"
 	"time"
-
-	"github.com/goccy/go-json"
 )
 
 var (


Test patch:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index b7181ed6a..b2b9ea40f 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -4,7 +4,7 @@ jobs:
   test:
     strategy:
       matrix:
-        go-version: ["1.19", "1.20", "1.21"]
+        go-version: ["1.18", "1.19", "1.20"]
     runs-on: ubuntu-latest
     steps:
       - uses: actions/setup-go@v4
diff --git a/access_application_test.go b/access_application_test.go
index 6904b7c69..d3423837c 100644
--- a/access_application_test.go
+++ b/access_application_test.go
@@ -48,8 +48,7 @@ func TestAccessApplications(t *testing.T) {
 					"app_launcher_visible": true,
 					"service_auth_401_redirect": true,
 					"path_cookie_attribute": true,
-					"custom_pages": ["480f4f69-1a28-4fdd-9240-1ed29f0ac1dc"],
-					"tags": ["engineers"]
+					"custom_pages": ["480f4f69-1a28-4fdd-9240-1ed29f0ac1dc"]
 				}
 			],
 			"result_info": {
@@ -87,7 +86,6 @@ func TestAccessApplications(t *testing.T) {
 		SkipInterstitial:         BoolPtr(true),
 		PathCookieAttribute:      BoolPtr(true),
 		CustomPages:              []string{"480f4f69-1a28-4fdd-9240-1ed29f0ac1dc"},
-		Tags:                     []string{"engineers"},
 		CustomNonIdentityDenyURL: "https://blocked.com",
 	}}
 
@@ -220,8 +218,7 @@ func TestCreateAccessApplications(t *testing.T) {
 				"logo_url": "https://www.example.com/example.png",
 				"skip_interstitial": true,
 				"app_launcher_visible": true,
-				"service_auth_401_redirect": true,
-				"tags": ["engineers"]
+				"service_auth_401_redirect": true
 			}
 		}
 		`)
@@ -249,7 +246,6 @@ func TestCreateAccessApplications(t *testing.T) {
 		CreatedAt:                &createdAt,
 		UpdatedAt:                &updatedAt,
 		CustomNonIdentityDenyURL: "https://blocked.com",
-		Tags:                     []string{"engineers"},
 	}
 
 	mux.HandleFunc("/accounts/"+testAccountID+"/access/apps", handler)
@@ -307,8 +303,7 @@ func TestUpdateAccessApplication(t *testing.T) {
 				"logo_url": "https://www.example.com/example.png",
 				"skip_interstitial": true,
 				"app_launcher_visible": true,
-				"service_auth_401_redirect": true,
-				"tags": ["engineers"]
+				"service_auth_401_redirect": true
 			}
 		}
 		`)
@@ -331,7 +326,6 @@ func TestUpdateAccessApplication(t *testing.T) {
 		CustomDenyURL:            "https://www.example.com",
 		LogoURL:                  "https://www.example.com/example.png",
 		CustomNonIdentityDenyURL: "https://blocked.com",
-		Tags:                     []string{"engineers"},
 		SkipInterstitial:         BoolPtr(true),
 		CreatedAt:                &createdAt,
 		UpdatedAt:                &updatedAt,
@@ -355,7 +349,6 @@ func TestUpdateAccessApplication(t *testing.T) {
 		LogoURL:                  "https://www.example.com/example.png",
 		SkipInterstitial:         BoolPtr(true),
 		CustomNonIdentityDenyURL: "https://blocked.com",
-		Tags:                     []string{"engineers"},
 	}
 
 	mux.HandleFunc("/accounts/"+testAccountID+"/access/apps/480f4f69-1a28-4fdd-9240-1ed29f0ac1db", handler)
@@ -641,7 +634,6 @@ func TestCreateSaasAccessApplications(t *testing.T) {
 				"app_launcher_visible": true,
 				"service_auth_401_redirect": true,
 				"custom_non_identity_deny_url": "https://blocked.com",
-				"tags": ["engineers"],
 				"saas_app": {
 					"consumer_service_url": "https://saas.example.com",
 					"sp_entity_id": "dash.example.com",
@@ -724,7 +716,6 @@ func TestCreateSaasAccessApplications(t *testing.T) {
 		CreatedAt:                &createdAt,
 		UpdatedAt:                &updatedAt,
 		CustomNonIdentityDenyURL: "https://blocked.com",
-		Tags:                     []string{"engineers"},
 	}
 
 	mux.HandleFunc("/accounts/"+testAccountID+"/access/apps", handler)
@@ -759,117 +750,3 @@ func TestCreateSaasAccessApplications(t *testing.T) {
 		assert.Equal(t, fullAccessApplication, actual)
 	}
 }
-
-func TestCreateApplicationWithAccessAppLauncherCustomization(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			"result": {
-				"id": "480f4f69-1a28-4fdd-9240-1ed29f0ac1db",
-				"created_at": "2014-01-01T05:20:00.12345Z",
-				"updated_at": "2014-01-01T05:20:00.12345Z",
-				"aud": "737646a56ab1df6ec9bddc7e5ca84eaf3b0768850f3ffb5d74f1534911fe3893",
-				"name": "App Launcher",
-				"type": "app_launcher",
-				"session_duration": "24h",
-				"auto_redirect_to_identity": false,
-				"enable_binding_cookie": false,
-				"custom_deny_url": "https://www.example.com",
-				"custom_deny_message": "denied!",
-				"logo_url": "https://www.example.com/example.png",
-				"skip_interstitial": true,
-				"app_launcher_visible": false,
-				"service_auth_401_redirect": false,
-				"landing_page_design": {
-					"title": "A title",
-					"message": "a message",
-					"image_url": "https://www.example.com/example.png",
-					"button_color": "green",
-					"button_text_color": "red"
-				},
-				"header_bg_color": "red",
-				"bg_color": "blue",
-				"footer_links": [
-					{
-						"url": "https://somesite.com",
-						"name": "bug"
-					}
-				]
-			}
-		}
-		`)
-	}
-
-	createdAt, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-	updatedAt, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-	fullAccessApplication := AccessApplication{
-		ID:                     "480f4f69-1a28-4fdd-9240-1ed29f0ac1db",
-		Name:                   "App Launcher",
-		Type:                   "app_launcher",
-		SessionDuration:        "24h",
-		AUD:                    "737646a56ab1df6ec9bddc7e5ca84eaf3b0768850f3ffb5d74f1534911fe3893",
-		AutoRedirectToIdentity: BoolPtr(false),
-		EnableBindingCookie:    BoolPtr(false),
-		AppLauncherVisible:     BoolPtr(false),
-		ServiceAuth401Redirect: BoolPtr(false),
-		CustomDenyMessage:      "denied!",
-		CustomDenyURL:          "https://www.example.com",
-		LogoURL:                "https://www.example.com/example.png",
-		SkipInterstitial:       BoolPtr(true),
-		CreatedAt:              &createdAt,
-		UpdatedAt:              &updatedAt,
-		AccessAppLauncherCustomization: AccessAppLauncherCustomization{
-			LandingPageDesign: AccessLandingPageDesign{
-				Title:           "A title",
-				Message:         "a message",
-				ImageURL:        "https://www.example.com/example.png",
-				ButtonColor:     "green",
-				ButtonTextColor: "red",
-			},
-			HeaderBackgroundColor: "red",
-			BackgroundColor:       "blue",
-			FooterLinks: []AccessFooterLink{
-				{
-					URL:  "https://somesite.com",
-					Name: "bug",
-				},
-			},
-		},
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/apps", handler)
-
-	actual, err := client.CreateAccessApplication(context.Background(), AccountIdentifier(testAccountID), CreateAccessApplicationParams{
-		Name:            "Admin Site",
-		SessionDuration: "24h",
-		Type:            "app_launcher",
-		AccessAppLauncherCustomization: AccessAppLauncherCustomization{
-			LandingPageDesign: AccessLandingPageDesign{
-				Title:           "A title",
-				Message:         "a message",
-				ImageURL:        "https://www.example.com/example.png",
-				ButtonColor:     "green",
-				ButtonTextColor: "red",
-			},
-			HeaderBackgroundColor: "red",
-			BackgroundColor:       "blue",
-			FooterLinks: []AccessFooterLink{
-				{
-					URL:  "https://somesite.com",
-					Name: "bug",
-				},
-			},
-		},
-	})
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, fullAccessApplication, actual)
-	}
-}
diff --git a/access_organization_test.go b/access_organization_test.go
index 295a7f7d8..1407eb7a9 100644
--- a/access_organization_test.go
+++ b/access_organization_test.go
@@ -29,7 +29,6 @@ func TestAccessOrganization(t *testing.T) {
 				"is_ui_read_only": false,
 				"user_seat_expiration_inactive_time": "720h",
 				"auto_redirect_to_identity": true,
-				"session_duration": "12h",
 				"login_design": {
 					"background_color": "#c5ed1b",
 					"logo_path": "https://example.com/logo.png",
@@ -58,7 +57,6 @@ func TestAccessOrganization(t *testing.T) {
 			FooterText:      "© Widget Corp",
 		},
 		IsUIReadOnly:                   BoolPtr(false),
-		SessionDuration:                StringPtr("12h"),
 		UserSeatExpirationInactiveTime: "720h",
 		AutoRedirectToIdentity:         BoolPtr(true),
 	}
@@ -97,7 +95,6 @@ func TestCreateAccessOrganization(t *testing.T) {
 				"name": "Widget Corps Internal Applications",
 				"auth_domain": "test.cloudflareaccess.com",
 				"is_ui_read_only": true,
-				"session_duration": "12h",
 				"login_design": {
 					"background_color": "#c5ed1b",
 					"logo_path": "https://example.com/logo.png",
@@ -125,8 +122,7 @@ func TestCreateAccessOrganization(t *testing.T) {
 			HeaderText:      "Widget Corp",
 			FooterText:      "© Widget Corp",
 		},
-		IsUIReadOnly:    BoolPtr(true),
-		SessionDuration: StringPtr("12h"),
+		IsUIReadOnly: BoolPtr(true),
 	}
 
 	mux.HandleFunc("/accounts/"+testAccountID+"/access/organizations", handler)
@@ -141,8 +137,7 @@ func TestCreateAccessOrganization(t *testing.T) {
 			HeaderText:      "Widget Corp",
 			FooterText:      "© Widget Corp",
 		},
-		IsUIReadOnly:    BoolPtr(true),
-		SessionDuration: StringPtr("12h"),
+		IsUIReadOnly: BoolPtr(true),
 	})
 
 	if assert.NoError(t, err) {
@@ -161,8 +156,7 @@ func TestCreateAccessOrganization(t *testing.T) {
 			HeaderText:      "Widget Corp",
 			FooterText:      "© Widget Corp",
 		},
-		IsUIReadOnly:    BoolPtr(true),
-		SessionDuration: StringPtr("12h"),
+		IsUIReadOnly: BoolPtr(true),
 	})
 
 	if assert.NoError(t, err) {
@@ -194,8 +188,7 @@ func TestUpdateAccessOrganization(t *testing.T) {
 					"footer_text": "© Widget Corp"
 				},
 				"is_ui_read_only": false,
-				"ui_read_only_toggle_reason": "this is my reason",
-				"session_duration": "12h"
+				"ui_read_only_toggle_reason": "this is my reason"
 			}
 		}
 		`)
@@ -218,7 +211,6 @@ func TestUpdateAccessOrganization(t *testing.T) {
 		},
 		IsUIReadOnly:           BoolPtr(false),
 		UIReadOnlyToggleReason: "this is my reason",
-		SessionDuration:        StringPtr("12h"),
 	}
 
 	mux.HandleFunc("/accounts/"+testAccountID+"/access/organizations", handler)
@@ -234,7 +226,6 @@ func TestUpdateAccessOrganization(t *testing.T) {
 			FooterText:      "© Widget Corp",
 		},
 		IsUIReadOnly:           BoolPtr(false),
-		SessionDuration:        StringPtr("12h"),
 		UIReadOnlyToggleReason: "this is my reason",
 	})
 
@@ -256,7 +247,6 @@ func TestUpdateAccessOrganization(t *testing.T) {
 		},
 		IsUIReadOnly:           BoolPtr(false),
 		UIReadOnlyToggleReason: "this is my reason",
-		SessionDuration:        StringPtr("12h"),
 	})
 
 	if assert.NoError(t, err) {
diff --git a/access_policy_test.go b/access_policy_test.go
index 6b9506023..045c45337 100644
--- a/access_policy_test.go
+++ b/access_policy_test.go
@@ -41,7 +41,6 @@ var (
 			map[string]interface{}{"email": map[string]interface{}{"email": "test@example.com"}},
 		},
 		IsolationRequired:            &isolationRequired,
-		SessionDuration:              StringPtr("12h"),
 		PurposeJustificationRequired: &purposeJustificationRequired,
 		ApprovalRequired:             &approvalRequired,
 		PurposeJustificationPrompt:   &purposeJustificationPrompt,
@@ -102,7 +101,6 @@ func TestAccessPolicies(t *testing.T) {
 				"purpose_justification_required": true,
 				"purpose_justification_prompt": "Please provide a business reason for your need to access before continuing.",
 				"approval_required": true,
-				"session_duration": "12h",
 				"approval_groups": [
 				  {
 					"email_list_uuid": "2413b6d7-bbe5-48bd-8fbb-e52069c85561",
@@ -187,7 +185,6 @@ func TestAccessPolicy(t *testing.T) {
 				"purpose_justification_required": true,
 				"purpose_justification_prompt": "Please provide a business reason for your need to access before continuing.",
 				"approval_required": true,
-				"session_duration": "12h",
 				"approval_groups": [
 					{
 						"email_list_uuid": "2413b6d7-bbe5-48bd-8fbb-e52069c85561",
@@ -263,7 +260,6 @@ func TestCreateAccessPolicy(t *testing.T) {
 				"purpose_justification_required": true,
 				"purpose_justification_prompt": "Please provide a business reason for your need to access before continuing.",
 				"approval_required": true,
-				"session_duration": "12h",
 				"approval_groups": [
 					{
 						"email_list_uuid": "2413b6d7-bbe5-48bd-8fbb-e52069c85561",
@@ -300,7 +296,6 @@ func TestCreateAccessPolicy(t *testing.T) {
 		Decision:                     "allow",
 		PurposeJustificationRequired: &purposeJustificationRequired,
 		PurposeJustificationPrompt:   &purposeJustificationPrompt,
-		SessionDuration:              StringPtr("12h"),
 		ApprovalGroups: []AccessApprovalGroup{
 			{
 				EmailListUuid:   "2413b6d7-bbe5-48bd-8fbb-e52069c85561",
@@ -333,7 +328,6 @@ func TestCreateAccessPolicy(t *testing.T) {
 func TestCreateAccessPolicyAuthContextRule(t *testing.T) {
 	setup()
 	defer teardown()
-
 	expectedAccessPolicyAuthContext := AccessPolicy{
 		ID:         "699d98642c564d2e855e9661899b7252",
 		Precedence: 1,
@@ -352,7 +346,6 @@ func TestCreateAccessPolicyAuthContextRule(t *testing.T) {
 		PurposeJustificationRequired: &purposeJustificationRequired,
 		ApprovalRequired:             &approvalRequired,
 		PurposeJustificationPrompt:   &purposeJustificationPrompt,
-		SessionDuration:              StringPtr("12h"),
 		ApprovalGroups: []AccessApprovalGroup{
 			{
 				EmailListUuid:   "2413b6d7-bbe5-48bd-8fbb-e52069c85561",
@@ -400,7 +393,6 @@ func TestCreateAccessPolicyAuthContextRule(t *testing.T) {
 				"purpose_justification_required": true,
 				"purpose_justification_prompt": "Please provide a business reason for your need to access before continuing.",
 				"approval_required": true,
-				"session_duration": "12h",
 				"approval_groups": [
 					{
 						"email_list_uuid": "2413b6d7-bbe5-48bd-8fbb-e52069c85561",
@@ -491,7 +483,6 @@ func TestUpdateAccessPolicy(t *testing.T) {
 		PurposeJustificationRequired: &purposeJustificationRequired,
 		ApprovalRequired:             &approvalRequired,
 		PurposeJustificationPrompt:   &purposeJustificationPrompt,
-		SessionDuration:              StringPtr("12h"),
 		ApprovalGroups: []AccessApprovalGroup{
 			{
 				EmailListUuid:   "2413b6d7-bbe5-48bd-8fbb-e52069c85561",
@@ -517,7 +508,6 @@ func TestUpdateAccessPolicy(t *testing.T) {
 				"created_at": "2014-01-01T05:20:00.12345Z",
 				"updated_at": "2014-01-01T05:20:00.12345Z",
 				"name": "Allow devs",
-				"session_duration": "12h",
 				"include": [
 					{
 						"email": {
diff --git a/access_seats_test.go b/access_seats_test.go
deleted file mode 100644
index 9b52235f6..000000000
--- a/access_seats_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-)
-
-var testAccessGroupSeatUID = "access-group-seat-uid"
-
-func TestUpdateAccessUserSeat_ZoneIsNotSupported(t *testing.T) {
-	setup()
-	defer teardown()
-
-	_, err := client.UpdateAccessUserSeat(context.Background(), testZoneRC, UpdateAccessUserSeatParams{})
-	assert.EqualError(t, err, fmt.Sprintf(errInvalidResourceContainerAccess, ZoneRouteLevel))
-}
-
-func TestUpdateAccessUserSeat_MissingUID(t *testing.T) {
-	setup()
-	defer teardown()
-
-	_, err := client.UpdateAccessUserSeat(context.Background(), testAccountRC, UpdateAccessUserSeatParams{})
-	assert.EqualError(t, err, "missing required access seat UID")
-}
-
-func TestUpdateAccessUserSeat(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"errors": [],
-			"messages": [],
-			"result": [
-			  {
-				"access_seat": false,
-				"created_at": "2014-01-01T05:20:00.12345Z",
-				"gateway_seat": false,
-				"seat_uid": null,
-				"updated_at": "2014-01-01T05:20:00.12345Z"
-			  }
-			],
-			"success": true,
-			"result_info": {
-			  "count": 1,
-			  "page": 1,
-			  "per_page": 20,
-			  "total_count": 2000
-			}
-		  }
-		`)
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/seats", handler)
-	createdAt, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-	updatedAt, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-	want := []AccessUpdateAccessUserSeatResult{
-		{
-			AccessSeat:  BoolPtr(false),
-			CreatedAt:   &createdAt,
-			GatewaySeat: BoolPtr(false),
-			SeatUID:     "",
-			UpdatedAt:   &updatedAt,
-		},
-	}
-
-	actual, err := client.UpdateAccessUserSeat(context.Background(), testAccountRC, UpdateAccessUserSeatParams{
-		SeatUID:     testAccessGroupSeatUID,
-		AccessSeat:  BoolPtr(false),
-		GatewaySeat: BoolPtr(false),
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, want, actual)
-	}
-}
diff --git a/access_tag_test.go b/access_tag_test.go
deleted file mode 100644
index 612a9e6c5..000000000
--- a/access_tag_test.go
+++ /dev/null
@@ -1,136 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-)
-
-func TestAccessTags(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, r.Method, http.MethodGet, "HTTP method")
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			"result": [
-				{
-					"name": "engineers",
-					"app_count": 0
-				}
-			],
-			"result_info": {
-				"page": 1,
-				"per_page": 20,
-				"count": 1,
-				"total_count": 1
-			}
-		}`)
-	}
-
-	want := []AccessTag{
-		{
-			Name:     "engineers",
-			AppCount: 0,
-		},
-	}
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/tags", handler)
-	actual, err := client.ListAccessTags(context.Background(), AccountIdentifier(testAccountID), ListAccessTagsParams{})
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, want, actual)
-	}
-}
-
-func TestAccessTag(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, r.Method, http.MethodGet, "HTTP method")
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			"result": {
-				"name": "engineers",
-				"app_count": 0
-			}
-		}`)
-	}
-
-	want := AccessTag{
-		Name:     "engineers",
-		AppCount: 0,
-	}
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/tags/engineers", handler)
-	actual, err := client.GetAccessTag(context.Background(), AccountIdentifier(testAccountID), "engineers")
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, want, actual)
-	}
-}
-
-func TestCreateAccessTag(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, r.Method, http.MethodPost, "HTTP method")
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			"result": {
-				"name": "sales",
-				"app_count": 0
-			}
-		}`)
-	}
-
-	Tag := AccessTag{
-		Name:     "sales",
-		AppCount: 0,
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/tags", handler)
-	actual, err := client.CreateAccessTag(context.Background(), AccountIdentifier(testAccountID), CreateAccessTagParams{
-		Name: "sales",
-	})
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, Tag, actual)
-	}
-}
-
-func TestDeleteAccessTag(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, r.Method, http.MethodDelete, "HTTP method")
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			result: {
-				"id": "engineers"
-			}
-		}`)
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/tags/engineers", handler)
-	err := client.DeleteAccessTag(context.Background(), AccountIdentifier(testAccountID), "engineers")
-
-	assert.NoError(t, err)
-}
diff --git a/access_users_test.go b/access_users_test.go
deleted file mode 100644
index 0d2e4bee0..000000000
--- a/access_users_test.go
+++ /dev/null
@@ -1,573 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-)
-
-var (
-	testAccessUserID        = "access-user-id"
-	testAccessUserSessionID = "access-user-session-id"
-
-	expectedListAccessUserResult = AccessUser{
-		AccessSeat:          BoolPtr(false),
-		ActiveDeviceCount:   2,
-		CreatedAt:           "2014-01-01T05:20:00.12345Z",
-		Email:               "jdoe@example.com",
-		GatewaySeat:         BoolPtr(false),
-		ID:                  "f3b12456-80dd-4e89-9f5f-ba3dfff12365",
-		LastSuccessfulLogin: "2020-07-01T05:20:00Z",
-		Name:                "Jane Doe",
-		SeatUID:             "",
-		UID:                 "",
-		UpdatedAt:           "2014-01-01T05:20:00.12345Z",
-	}
-
-	expectedGetAccessUserActiveSessionsResult = AccessUserActiveSessionResult{
-		Expiration: 1694813506,
-		Metadata: AccessUserActiveSessionMetadata{
-			Apps: map[string]AccessUserActiveSessionMetadataApp{
-				"property1": {
-					Hostname: "test.example.com",
-					Name:     "app name",
-					Type:     "self_hosted",
-					UID:      "cc2a8145-0128-4429-87f3-872c4d380c4e",
-				},
-				"property2": {
-					Hostname: "test.example.com",
-					Name:     "app name",
-					Type:     "self_hosted",
-					UID:      "cc2a8145-0128-4429-87f3-872c4d380c4e",
-				},
-			},
-			Expires: 1694813506,
-			IAT:     1694791905,
-			Nonce:   "X1aXj1lFVcqqyoXF",
-			TTL:     21600,
-		},
-		Name: "string",
-	}
-
-	expectedGetAccessUserFailedLoginsResult = AccessUserFailedLoginResult{
-		Expiration: 0,
-		Metadata: AccessUserFailedLoginMetadata{
-			AppName:   "Test App",
-			Aud:       "39691c1480a2352a18ece567debc2b32552686cbd38eec0887aa18d5d3f00c04",
-			Datetime:  "2022-02-02T21:54:34.914Z",
-			RayID:     "6d76a8a42ead4133",
-			UserEmail: "test@cloudflare.com",
-			UserUUID:  "57171132-e453-4ee8-b2a5-8cbaad333207",
-		},
-	}
-
-	expectedGetAccessUserLastSeenIdentityResult = GetAccessUserLastSeenIdentityResult{
-		AccountID:  "1234567890",
-		AuthStatus: "NONE",
-		CommonName: "",
-		DevicePosture: map[string]AccessUserDevicePosture{
-			"property1": {
-				Check: AccessUserDevicePostureCheck{
-					Exists: BoolPtr(true),
-					Path:   "string",
-				},
-				Data:        map[string]interface{}{},
-				Description: "string",
-				Error:       "string",
-				ID:          "string",
-				RuleName:    "string",
-				Success:     BoolPtr(true),
-				Timestamp:   "string",
-				Type:        "string",
-			},
-			"property2": {
-				Check: AccessUserDevicePostureCheck{
-					Exists: BoolPtr(true),
-					Path:   "string",
-				},
-				Data:        map[string]interface{}{},
-				Description: "string",
-				Error:       "string",
-				ID:          "string",
-				RuleName:    "string",
-				Success:     BoolPtr(true),
-				Timestamp:   "string",
-				Type:        "string",
-			},
-		},
-		DeviceID: "",
-		DeviceSessions: map[string]AccessUserDeviceSession{
-			"property1": {
-				LastAuthenticated: 1638832687,
-			},
-			"property2": {
-				LastAuthenticated: 1638832687,
-			},
-		},
-		Email: "test@cloudflare.com",
-		Geo: AccessUserIdentityGeo{
-			Country: "US",
-		},
-		IAT: 1694791905,
-		IDP: AccessUserIDP{
-			ID:   "string",
-			Type: "string",
-		},
-		IP:        "127.0.0.0",
-		IsGateway: BoolPtr(false),
-		IsWarp:    BoolPtr(false),
-		MtlsAuth: AccessUserMTLSAuth{
-			AuthStatus:    "string",
-			CertIssuerDN:  "string",
-			CertIssuerSKI: "string",
-			CertPresented: BoolPtr(true),
-			CertSerial:    "string",
-		},
-		ServiceTokenID:     "",
-		ServiceTokenStatus: BoolPtr(false),
-		UserUUID:           "57cf8cf2-f55a-4588-9ac9-f5e41e9f09b4",
-		Version:            2,
-	}
-
-	expectedGetAccessUserSingleActiveSessionResult = GetAccessUserSingleActiveSessionResult{
-		AccountID:  "1234567890",
-		AuthStatus: "NONE",
-		CommonName: "",
-		DevicePosture: map[string]AccessUserDevicePosture{
-			"property1": {
-				Check: AccessUserDevicePostureCheck{
-					Exists: BoolPtr(true),
-					Path:   "string",
-				},
-				Data:        map[string]interface{}{},
-				Description: "string",
-				Error:       "string",
-				ID:          "string",
-				RuleName:    "string",
-				Success:     BoolPtr(true),
-				Timestamp:   "string",
-				Type:        "string",
-			},
-			"property2": {
-				Check: AccessUserDevicePostureCheck{
-					Exists: BoolPtr(true),
-					Path:   "string",
-				},
-				Data:        map[string]interface{}{},
-				Description: "string",
-				Error:       "string",
-				ID:          "string",
-				RuleName:    "string",
-				Success:     BoolPtr(true),
-				Timestamp:   "string",
-				Type:        "string",
-			},
-		},
-		DeviceID: "",
-		DeviceSessions: map[string]AccessUserDeviceSession{
-			"property1": {
-				LastAuthenticated: 1638832687,
-			},
-			"property2": {
-				LastAuthenticated: 1638832687,
-			},
-		},
-		Email: "test@cloudflare.com",
-		Geo: AccessUserIdentityGeo{
-			Country: "US",
-		},
-		IAT: 1694791905,
-		IDP: AccessUserIDP{
-			ID:   "string",
-			Type: "string",
-		},
-		IP:        "127.0.0.0",
-		IsGateway: BoolPtr(false),
-		IsWarp:    BoolPtr(false),
-		MtlsAuth: AccessUserMTLSAuth{
-			AuthStatus:    "string",
-			CertIssuerDN:  "string",
-			CertIssuerSKI: "string",
-			CertPresented: BoolPtr(true),
-			CertSerial:    "string",
-		},
-		ServiceTokenID:     "",
-		ServiceTokenStatus: BoolPtr(false),
-		UserUUID:           "57cf8cf2-f55a-4588-9ac9-f5e41e9f09b4",
-		Version:            2,
-		IsActive:           BoolPtr(true),
-	}
-)
-
-func TestListAccessUsers_ZoneIsNotSupported(t *testing.T) {
-	setup()
-	defer teardown()
-
-	_, _, err := client.ListAccessUsers(context.Background(), testZoneRC, AccessUserParams{})
-	assert.EqualError(t, err, fmt.Sprintf(errInvalidResourceContainerAccess, ZoneRouteLevel))
-}
-
-func TestListAccessUsers(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"errors": [],
-			"messages": [],
-			"result": [
-			  {
-				"access_seat": false,
-				"active_device_count": 2,
-				"created_at": "2014-01-01T05:20:00.12345Z",
-				"email": "jdoe@example.com",
-				"gateway_seat": false,
-				"id": "f3b12456-80dd-4e89-9f5f-ba3dfff12365",
-				"last_successful_login": "2020-07-01T05:20:00Z",
-				"name": "Jane Doe",
-				"seat_uid": null,
-				"uid": null,
-				"updated_at": "2014-01-01T05:20:00.12345Z"
-			  }
-			],
-			"success": true,
-			"result_info": {
-			  "count": 1,
-			  "page": 1,
-			  "per_page": 100,
-			  "total_count": 1
-			}
-		  }
-		`)
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/users", handler)
-
-	actual, _, err := client.ListAccessUsers(context.Background(), testAccountRC, AccessUserParams{})
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, []AccessUser{expectedListAccessUserResult}, actual)
-	}
-}
-
-func TestGetGetAccessUserActiveSessions_ZoneIsNotSupported(t *testing.T) {
-	setup()
-	defer teardown()
-
-	_, err := client.GetAccessUserActiveSessions(context.Background(), testZoneRC, testAccessUserID)
-	assert.EqualError(t, err, fmt.Sprintf(errInvalidResourceContainerAccess, ZoneRouteLevel))
-}
-
-func TestGetGetAccessUserActiveSessions(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"errors": [],
-			"messages": [],
-			"result": [
-			  {
-				"expiration": 1694813506,
-				"metadata": {
-				  "apps": {
-					"property1": {
-					  "hostname": "test.example.com",
-					  "name": "app name",
-					  "type": "self_hosted",
-					  "uid": "cc2a8145-0128-4429-87f3-872c4d380c4e"
-					},
-					"property2": {
-					  "hostname": "test.example.com",
-					  "name": "app name",
-					  "type": "self_hosted",
-					  "uid": "cc2a8145-0128-4429-87f3-872c4d380c4e"
-					}
-				  },
-				  "expires": 1694813506,
-				  "iat": 1694791905,
-				  "nonce": "X1aXj1lFVcqqyoXF",
-				  "ttl": 21600
-				},
-				"name": "string"
-			  }
-			],
-			"success": true,
-			"result_info": {
-			  "count": 1,
-			  "page": 1,
-			  "per_page": 20,
-			  "total_count": 2000
-			}
-		  }
-		`)
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/users/"+testAccessUserID+"/active_sessions", handler)
-
-	actual, err := client.GetAccessUserActiveSessions(context.Background(), testAccountRC, testAccessUserID)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, []AccessUserActiveSessionResult{expectedGetAccessUserActiveSessionsResult}, actual)
-	}
-}
-
-func TestGetAccessUserSingleActiveSession_ZoneIsNotSupported(t *testing.T) {
-	setup()
-	defer teardown()
-
-	_, err := client.GetAccessUserSingleActiveSession(context.Background(), testZoneRC, testAccessUserID, testAccessUserSessionID)
-	assert.EqualError(t, err, fmt.Sprintf(errInvalidResourceContainerAccess, ZoneRouteLevel))
-}
-
-func TestGetAccessUserSingleActiveSession(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"errors": [],
-			"messages": [],
-			"result": {
-			  "account_id": "1234567890",
-			  "auth_status": "NONE",
-			  "common_name": "",
-			  "devicePosture": {
-				"property1": {
-				  "check": {
-					"exists": true,
-					"path": "string"
-				  },
-				  "data": {},
-				  "description": "string",
-				  "error": "string",
-				  "id": "string",
-				  "rule_name": "string",
-				  "success": true,
-				  "timestamp": "string",
-				  "type": "string"
-				},
-				"property2": {
-				  "check": {
-					"exists": true,
-					"path": "string"
-				  },
-				  "data": {},
-				  "description": "string",
-				  "error": "string",
-				  "id": "string",
-				  "rule_name": "string",
-				  "success": true,
-				  "timestamp": "string",
-				  "type": "string"
-				}
-			  },
-			  "device_id": "",
-			  "device_sessions": {
-				"property1": {
-				  "last_authenticated": 1638832687
-				},
-				"property2": {
-				  "last_authenticated": 1638832687
-				}
-			  },
-			  "email": "test@cloudflare.com",
-			  "geo": {
-				"country": "US"
-			  },
-			  "iat": 1694791905,
-			  "idp": {
-				"id": "string",
-				"type": "string"
-			  },
-			  "ip": "127.0.0.0",
-			  "is_gateway": false,
-			  "is_warp": false,
-			  "mtls_auth": {
-				"auth_status": "string",
-				"cert_issuer_dn": "string",
-				"cert_issuer_ski": "string",
-				"cert_presented": true,
-				"cert_serial": "string"
-			  },
-			  "service_token_id": "",
-			  "service_token_status": false,
-			  "user_uuid": "57cf8cf2-f55a-4588-9ac9-f5e41e9f09b4",
-			  "version": 2,
-			  "isActive": true
-			},
-			"success": true
-		  }
-		`)
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/users/"+testAccessUserID+"/active_sessions/"+testAccessUserSessionID, handler)
-
-	actual, err := client.GetAccessUserSingleActiveSession(context.Background(), testAccountRC, testAccessUserID, testAccessUserSessionID)
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expectedGetAccessUserSingleActiveSessionResult, actual)
-	}
-}
-
-func TestGetAccessUserFailedLogins_ZoneIsNotSupported(t *testing.T) {
-	setup()
-	defer teardown()
-
-	_, err := client.GetAccessUserFailedLogins(context.Background(), testZoneRC, testAccessUserID)
-	assert.EqualError(t, err, fmt.Sprintf(errInvalidResourceContainerAccess, ZoneRouteLevel))
-}
-
-func TestGetAccessUserFailedLogins(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"errors": [],
-			"messages": [],
-			"result": [
-			  {
-				"expiration": 0,
-				"metadata": {
-				  "app_name": "Test App",
-				  "aud": "39691c1480a2352a18ece567debc2b32552686cbd38eec0887aa18d5d3f00c04",
-				  "datetime": "2022-02-02T21:54:34.914Z",
-				  "ray_id": "6d76a8a42ead4133",
-				  "user_email": "test@cloudflare.com",
-				  "user_uuid": "57171132-e453-4ee8-b2a5-8cbaad333207"
-				}
-			  }
-			],
-			"success": true,
-			"result_info": {
-			  "count": 1,
-			  "page": 1,
-			  "per_page": 20,
-			  "total_count": 2000
-			}
-		  }
-		`)
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/users/"+testAccessUserID+"/failed_logins", handler)
-
-	actual, err := client.GetAccessUserFailedLogins(context.Background(), testAccountRC, testAccessUserID)
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, []AccessUserFailedLoginResult{expectedGetAccessUserFailedLoginsResult}, actual)
-	}
-}
-
-func TestGetAccessUserLastSeenIdentity_ZoneIsNotSupported(t *testing.T) {
-	setup()
-	defer teardown()
-
-	_, err := client.GetAccessUserLastSeenIdentity(context.Background(), testZoneRC, testAccessUserID)
-	assert.EqualError(t, err, fmt.Sprintf(errInvalidResourceContainerAccess, ZoneRouteLevel))
-}
-
-func TestGetAccessUserLastSeenIdentity(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-  "errors": [],
-  "messages": [],
-  "result": {
-    "account_id": "1234567890",
-    "auth_status": "NONE",
-    "common_name": "",
-    "devicePosture": {
-      "property1": {
-        "check": {
-          "exists": true,
-          "path": "string"
-        },
-        "data": {},
-        "description": "string",
-        "error": "string",
-        "id": "string",
-        "rule_name": "string",
-        "success": true,
-        "timestamp": "string",
-        "type": "string"
-      },
-      "property2": {
-        "check": {
-          "exists": true,
-          "path": "string"
-        },
-        "data": {},
-        "description": "string",
-        "error": "string",
-        "id": "string",
-        "rule_name": "string",
-        "success": true,
-        "timestamp": "string",
-        "type": "string"
-      }
-    },
-    "device_id": "",
-    "device_sessions": {
-      "property1": {
-        "last_authenticated": 1638832687
-      },
-      "property2": {
-        "last_authenticated": 1638832687
-      }
-    },
-    "email": "test@cloudflare.com",
-    "geo": {
-      "country": "US"
-    },
-    "iat": 1694791905,
-    "idp": {
-      "id": "string",
-      "type": "string"
-    },
-    "ip": "127.0.0.0",
-    "is_gateway": false,
-    "is_warp": false,
-    "mtls_auth": {
-      "auth_status": "string",
-      "cert_issuer_dn": "string",
-      "cert_issuer_ski": "string",
-      "cert_presented": true,
-      "cert_serial": "string"
-    },
-    "service_token_id": "",
-    "service_token_status": false,
-    "user_uuid": "57cf8cf2-f55a-4588-9ac9-f5e41e9f09b4",
-    "version": 2
-  },
-  "success": true
-}
-		`)
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/access/users/"+testAccessUserID+"/last_seen_identity", handler)
-
-	actual, err := client.GetAccessUserLastSeenIdentity(context.Background(), testAccountRC, testAccessUserID)
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expectedGetAccessUserLastSeenIdentityResult, actual)
-	}
-}
diff --git a/account_roles_test.go b/account_roles_test.go
index 22d0ac905..7658f3dfe 100644
--- a/account_roles_test.go
+++ b/account_roles_test.go
@@ -57,14 +57,10 @@ func TestAccountRoles(t *testing.T) {
 		`)
 	}
 
-	mux.HandleFunc(fmt.Sprintf("/accounts/%s/roles", testAccountID), handler)
+	mux.HandleFunc("/accounts/01a7362d577a6c3019a474fd6f485823/roles", handler)
 	want := []AccountRole{expectedAccountRole}
-	_, err := client.ListAccountRoles(context.Background(), AccountIdentifier(""), ListAccountRolesParams{})
-	if assert.Error(t, err, "Expected error when no account ID is provided") {
-		assert.Equal(t, ErrMissingAccountID, err)
-	}
 
-	actual, err := client.ListAccountRoles(context.Background(), testAccountRC, ListAccountRolesParams{})
+	actual, err := client.AccountRoles(context.Background(), "01a7362d577a6c3019a474fd6f485823")
 
 	if assert.NoError(t, err) {
 		assert.Equal(t, want, actual)
@@ -107,13 +103,9 @@ func TestAccountRole(t *testing.T) {
 		`)
 	}
 
-	mux.HandleFunc(fmt.Sprintf("/accounts/%s/roles/3536bcfad5faccb999b47003c79917fb", testAccountID), handler)
-	_, err := client.GetAccountRole(context.Background(), AccountIdentifier(""), "3536bcfad5faccb999b47003c79917fb")
-	if assert.Error(t, err, "Expected error when no account ID is provided") {
-		assert.Equal(t, ErrMissingAccountID, err)
-	}
+	mux.HandleFunc("/accounts/01a7362d577a6c3019a474fd6f485823/roles/3536bcfad5faccb999b47003c79917fb", handler)
 
-	actual, err := client.GetAccountRole(context.Background(), testAccountRC, "3536bcfad5faccb999b47003c79917fb")
+	actual, err := client.AccountRole(context.Background(), "01a7362d577a6c3019a474fd6f485823", "3536bcfad5faccb999b47003c79917fb")
 
 	if assert.NoError(t, err) {
 		assert.Equal(t, expectedAccountRole, actual)
diff --git a/api_shield_api_discovery_test.go b/api_shield_api_discovery_test.go
deleted file mode 100644
index 3344c4934..000000000
--- a/api_shield_api_discovery_test.go
+++ /dev/null
@@ -1,383 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"net/http"
-	"net/url"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-)
-
-const testAPIShieldDiscoveryOperationID = "d3f614c0-7d73-4e4f-8d17-4215e7d78b77"
-
-func TestListAPIShieldDiscoveryOperations(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/discovery/operations", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": [
-			{
-				"id": "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-				"method": "POST",
-				"host": "api.cloudflare.com",
-				"endpoint": "/client/v4/zones",
-				"last_updated": "2023-03-02T15:46:06.000000Z",
-				"origin": ["ML"],
-				"state": "review"
-			}
-		],
-		"result_info": {
-			"page": 3,
-			"per_page": 20,
-			"count": 1,
-			"total_count": 2000
-		}
-	}`
-
-	setup()
-	t.Cleanup(teardown)
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, actualResultInfo, err := client.ListAPIShieldDiscoveryOperations(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		ListAPIShieldDiscoveryOperationsParams{},
-	)
-
-	lastUpdated := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-	expectedOps := []APIShieldDiscoveryOperation{
-		{
-			Method:      "POST",
-			Host:        "api.cloudflare.com",
-			Endpoint:    "/client/v4/zones",
-			ID:          "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-			LastUpdated: &lastUpdated,
-			Origin:      []APIShieldDiscoveryOrigin{APIShieldDiscoveryOriginML},
-			State:       APIShieldDiscoveryStateReview,
-		},
-	}
-
-	expectedResultInfo := ResultInfo{
-		Page:    3,
-		PerPage: 20,
-		Count:   1,
-		Total:   2000,
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expectedOps, actual)
-		assert.Equal(t, expectedResultInfo, actualResultInfo)
-	}
-}
-
-func TestListAPIShieldDiscoveryOperationsWithParams(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/discovery/operations", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": [
-			{
-				"id": "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-				"method": "POST",
-				"host": "api.cloudflare.com",
-				"endpoint": "/client/v4/zones",
-				"last_updated": "2023-03-02T15:46:06.000000Z",
-				"origin": ["SessionIdentifier"],
-				"state": "saved",
-				"features": {
-					"traffic_stats": {}
-				}
-			}
-		],
-		"result_info": {
-			"page": 3,
-			"per_page": 20,
-			"count": 1,
-			"total_count": 2000
-		}
-	}`
-
-	tests := []struct {
-		name           string
-		params         ListAPIShieldDiscoveryOperationsParams
-		expectedParams url.Values
-	}{
-		{
-			name: "all params",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				Direction: "desc",
-				OrderBy:   "host",
-				Hosts:     []string{"api.cloudflare.com", "developers.cloudflare.com"},
-				Methods:   []string{"GET", "PUT"},
-				Endpoint:  "/client",
-				Origin:    APIShieldDiscoveryOriginSessionIdentifier,
-				State:     APIShieldDiscoveryStateSaved,
-				Diff:      true,
-				PaginationOptions: PaginationOptions{
-					Page:    1,
-					PerPage: 25,
-				},
-			},
-			expectedParams: url.Values{
-				"direction": []string{"desc"},
-				"order":     []string{"host"},
-				"host":      []string{"api.cloudflare.com", "developers.cloudflare.com"},
-				"method":    []string{"GET", "PUT"},
-				"endpoint":  []string{"/client"},
-				"origin":    []string{"SessionIdentifier"},
-				"state":     []string{"saved"},
-				"diff":      []string{"true"},
-				"page":      []string{"1"},
-				"per_page":  []string{"25"},
-			},
-		},
-		{
-			name: "direction only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				Direction: "desc",
-			},
-			expectedParams: url.Values{
-				"direction": []string{"desc"},
-			},
-		},
-		{
-			name: "order only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				OrderBy: "host",
-			},
-			expectedParams: url.Values{
-				"order": []string{"host"},
-			},
-		},
-		{
-			name: "hosts only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				Hosts: []string{"api.cloudflare.com", "developers.cloudflare.com"},
-			},
-			expectedParams: url.Values{
-				"host": []string{"api.cloudflare.com", "developers.cloudflare.com"},
-			},
-		},
-		{
-			name: "methods only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				Methods: []string{"GET", "PUT"},
-			},
-			expectedParams: url.Values{
-				"method": []string{"GET", "PUT"},
-			},
-		},
-		{
-			name: "endpoint only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				Endpoint: "/client",
-			},
-			expectedParams: url.Values{
-				"endpoint": []string{"/client"},
-			},
-		},
-		{
-			name: "origin only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				Origin: APIShieldDiscoveryOriginSessionIdentifier,
-			},
-			expectedParams: url.Values{
-				"origin": []string{"SessionIdentifier"},
-			},
-		},
-		{
-			name: "state only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				State: APIShieldDiscoveryStateSaved,
-			},
-			expectedParams: url.Values{
-				"state": []string{"saved"},
-			},
-		},
-		{
-			name: "diff only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				Diff: true,
-			},
-			expectedParams: url.Values{
-				"diff": []string{"true"},
-			},
-		},
-		{
-			name: "pagination only",
-			params: ListAPIShieldDiscoveryOperationsParams{
-				PaginationOptions: PaginationOptions{
-					Page:    1,
-					PerPage: 25,
-				},
-			},
-			expectedParams: url.Values{
-				"page":     []string{"1"},
-				"per_page": []string{"25"},
-			},
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			setup()
-			t.Cleanup(teardown)
-			handler := func(w http.ResponseWriter, r *http.Request) {
-				require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-				require.Equal(t, test.expectedParams, r.URL.Query())
-				w.Header().Set("content-type", "application/json")
-				fmt.Fprint(w, response)
-			}
-
-			mux.HandleFunc(endpoint, handler)
-
-			actual, _, err := client.ListAPIShieldDiscoveryOperations(
-				context.Background(),
-				ZoneIdentifier(testZoneID),
-				test.params,
-			)
-
-			lastUpdated := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-			expected := []APIShieldDiscoveryOperation{
-				{
-					Method:      "POST",
-					Host:        "api.cloudflare.com",
-					Endpoint:    "/client/v4/zones",
-					ID:          "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-					LastUpdated: &lastUpdated,
-					Origin:      []APIShieldDiscoveryOrigin{APIShieldDiscoveryOriginSessionIdentifier},
-					State:       APIShieldDiscoveryStateSaved,
-					Features: map[string]any{
-						"traffic_stats": map[string]any{},
-					},
-				},
-			}
-
-			if assert.NoError(t, err) {
-				assert.Equal(t, expected, actual)
-			}
-		})
-	}
-}
-
-func TestUpdateAPIShieldDiscoveryOperation(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/discovery/operations/%s", testZoneID, testAPIShieldDiscoveryOperationID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"state": "ignored"
-		}
-	}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-
-		body, err := io.ReadAll(r.Body)
-		require.NoError(t, err)
-		require.Equal(t, `{"state":"ignored"}`, string(body))
-
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.UpdateAPIShieldDiscoveryOperation(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		UpdateAPIShieldDiscoveryOperationParams{
-			OperationID: testAPIShieldDiscoveryOperationID,
-			State:       APIShieldDiscoveryStateIgnored,
-		},
-	)
-
-	// patch result is a cut down representation of the schema
-	// so metadata like created date is not populated
-	expected := &UpdateAPIShieldDiscoveryOperation{
-		State: APIShieldDiscoveryStateIgnored,
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-
-	assert.NoError(t, err)
-}
-
-func TestUpdateAPIShieldDiscoveryOperations(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/discovery/operations", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"9b16ce22-d1bf-425d-869f-a11f8240fafb": { "state": "ignored" },
-			"c51c2ea1-a690-48fd-8e3f-7fc79b269947": { "state": "review" }
-		}
-	}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-
-		body, err := io.ReadAll(r.Body)
-		require.NoError(t, err)
-		require.Equal(t, `{"9b16ce22-d1bf-425d-869f-a11f8240fafb":{"state":"ignored"},"c51c2ea1-a690-48fd-8e3f-7fc79b269947":{"state":"review"}}`, string(body))
-
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.UpdateAPIShieldDiscoveryOperations(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		UpdateAPIShieldDiscoveryOperationsParams{
-			"9b16ce22-d1bf-425d-869f-a11f8240fafb": UpdateAPIShieldDiscoveryOperation{State: APIShieldDiscoveryStateIgnored},
-			"c51c2ea1-a690-48fd-8e3f-7fc79b269947": UpdateAPIShieldDiscoveryOperation{State: APIShieldDiscoveryStateReview},
-		},
-	)
-
-	expected := &UpdateAPIShieldDiscoveryOperationsParams{
-		"9b16ce22-d1bf-425d-869f-a11f8240fafb": UpdateAPIShieldDiscoveryOperation{State: APIShieldDiscoveryStateIgnored},
-		"c51c2ea1-a690-48fd-8e3f-7fc79b269947": UpdateAPIShieldDiscoveryOperation{State: APIShieldDiscoveryStateReview},
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-
-	assert.NoError(t, err)
-}
-
-func TestMustProvideDiscoveryOperationID(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	_, err := client.UpdateAPIShieldDiscoveryOperation(context.Background(), ZoneIdentifier(testZoneID), UpdateAPIShieldDiscoveryOperationParams{})
-	require.ErrorContains(t, err, "operation ID must be provided")
-}
diff --git a/api_shield_operations_test.go b/api_shield_operations_test.go
deleted file mode 100644
index fdcc25cc8..000000000
--- a/api_shield_operations_test.go
+++ /dev/null
@@ -1,491 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"net/http"
-	"net/url"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-)
-
-const testAPIShieldOperationId = "9def2cb0-3ed0-4737-92ca-f09efa4718fd"
-
-func TestGetAPIShieldOperation(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/operations/%s", testZoneID, testAPIShieldOperationId)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"operation_id": "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-			"method": "POST",
-			"host": "api.cloudflare.com",
-			"endpoint": "/client/v4/zones",
-			"last_updated": "2023-03-02T15:46:06.000000Z"
-		}
-	}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.GetAPIShieldOperation(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		GetAPIShieldOperationParams{
-			OperationID: testAPIShieldOperationId,
-		},
-	)
-
-	time := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-	expected := &APIShieldOperation{
-		APIShieldBasicOperation: APIShieldBasicOperation{
-			Method:   "POST",
-			Host:     "api.cloudflare.com",
-			Endpoint: "/client/v4/zones",
-		},
-		ID:          testAPIShieldOperationId,
-		LastUpdated: &time,
-		Features:    nil,
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-}
-
-func TestGetAPIShieldOperationWithParams(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/operations/%s", testZoneID, testAPIShieldOperationId)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"operation_id": "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-			"method": "POST",
-			"host": "api.cloudflare.com",
-			"endpoint": "/client/v4/zones",
-			"last_updated": "2023-03-02T15:46:06.000000Z",
-			"features":{
-				"thresholds":{},
-				"parameter_schemas":{}
-			}
-		}
-	}`
-
-	tests := []struct {
-		name           string
-		getParams      GetAPIShieldOperationParams
-		expectedParams url.Values
-	}{
-		{
-			name: "one feature",
-			getParams: GetAPIShieldOperationParams{
-				OperationID: testAPIShieldOperationId,
-				Features:    []string{"thresholds"},
-			},
-			expectedParams: url.Values{
-				"feature": []string{"thresholds"},
-			},
-		},
-		{
-			name: "more than one feature",
-			getParams: GetAPIShieldOperationParams{
-				OperationID: testAPIShieldOperationId,
-				Features:    []string{"thresholds", "parameter_schemas"},
-			},
-			expectedParams: url.Values{
-				"feature": []string{"thresholds", "parameter_schemas"},
-			},
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			setup()
-			t.Cleanup(teardown)
-			handler := func(w http.ResponseWriter, r *http.Request) {
-				require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-				require.Equal(t, test.expectedParams, r.URL.Query())
-				w.Header().Set("content-type", "application/json")
-				fmt.Fprint(w, response)
-			}
-
-			mux.HandleFunc(endpoint, handler)
-
-			actual, err := client.GetAPIShieldOperation(
-				context.Background(),
-				ZoneIdentifier(testZoneID),
-				test.getParams,
-			)
-
-			time := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-			expected := &APIShieldOperation{
-				APIShieldBasicOperation: APIShieldBasicOperation{
-					Method:   "POST",
-					Host:     "api.cloudflare.com",
-					Endpoint: "/client/v4/zones",
-				},
-				ID:          "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-				LastUpdated: &time,
-				Features: map[string]any{
-					"thresholds":        map[string]any{},
-					"parameter_schemas": map[string]any{},
-				},
-			}
-
-			if assert.NoError(t, err) {
-				assert.Equal(t, expected, actual)
-			}
-		})
-	}
-}
-
-func TestListAPIShieldOperations(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/operations", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": [
-			{
-				"operation_id": "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-				"method": "POST",
-				"host": "api.cloudflare.com",
-				"endpoint": "/client/v4/zones",
-				"last_updated": "2023-03-02T15:46:06.000000Z"
-			}
-
-		],
-		"result_info": {
-			"page": 3,
-			"per_page": 20,
-			"count": 1,
-			"total_count": 2000
-		}
-	}`
-
-	setup()
-	t.Cleanup(teardown)
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, actualResultInfo, err := client.ListAPIShieldOperations(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		ListAPIShieldOperationsParams{},
-	)
-
-	time := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-	expectedOps := []APIShieldOperation{
-		{
-			APIShieldBasicOperation: APIShieldBasicOperation{
-				Method:   "POST",
-				Host:     "api.cloudflare.com",
-				Endpoint: "/client/v4/zones",
-			},
-			ID:          "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-			LastUpdated: &time,
-			Features:    nil,
-		},
-	}
-
-	expectedResultInfo := ResultInfo{
-		Page:    3,
-		PerPage: 20,
-		Count:   1,
-		Total:   2000,
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expectedOps, actual)
-		assert.Equal(t, expectedResultInfo, actualResultInfo)
-	}
-}
-
-func TestListAPIShieldOperationsWithParams(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/operations", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": [
-			{
-				"operation_id": "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-				"method": "POST",
-				"host": "api.cloudflare.com",
-				"endpoint": "/client/v4/zones",
-				"last_updated": "2023-03-02T15:46:06.000000Z",
-				"features": {
-					"thresholds": {}
-                }
-			}
-		],
-		"result_info": {
-			"page": 3,
-			"per_page": 20,
-			"count": 1,
-			"total_count": 2000
-		}
-	}`
-
-	tests := []struct {
-		name           string
-		params         ListAPIShieldOperationsParams
-		expectedParams url.Values
-	}{
-		{
-			name: "all params",
-			params: ListAPIShieldOperationsParams{
-				Features:  []string{"thresholds", "parameter_schemas"},
-				Direction: "desc",
-				OrderBy:   "host",
-				APIShieldListOperationsFilters: APIShieldListOperationsFilters{
-					Hosts:    []string{"api.cloudflare.com", "developers.cloudflare.com"},
-					Methods:  []string{"GET", "PUT"},
-					Endpoint: "/client",
-				},
-				PaginationOptions: PaginationOptions{
-					Page:    1,
-					PerPage: 25,
-				},
-			},
-			expectedParams: url.Values{
-				"feature":   []string{"thresholds", "parameter_schemas"},
-				"direction": []string{"desc"},
-				"order":     []string{"host"},
-				"host":      []string{"api.cloudflare.com", "developers.cloudflare.com"},
-				"method":    []string{"GET", "PUT"},
-				"endpoint":  []string{"/client"},
-				"page":      []string{"1"},
-				"per_page":  []string{"25"},
-			},
-		},
-		{
-			name: "features only",
-			params: ListAPIShieldOperationsParams{
-				Features: []string{"thresholds", "parameter_schemas"},
-			},
-			expectedParams: url.Values{
-				"feature": []string{"thresholds", "parameter_schemas"},
-			},
-		},
-		{
-			name: "direction only",
-			params: ListAPIShieldOperationsParams{
-				Direction: "desc",
-			},
-			expectedParams: url.Values{
-				"direction": []string{"desc"},
-			},
-		},
-		{
-			name: "order only",
-			params: ListAPIShieldOperationsParams{
-				OrderBy: "host",
-			},
-			expectedParams: url.Values{
-				"order": []string{"host"},
-			},
-		},
-		{
-			name: "hosts only",
-			params: ListAPIShieldOperationsParams{
-				APIShieldListOperationsFilters: APIShieldListOperationsFilters{
-					Hosts: []string{"api.cloudflare.com", "developers.cloudflare.com"},
-				},
-			},
-			expectedParams: url.Values{
-				"host": []string{"api.cloudflare.com", "developers.cloudflare.com"},
-			},
-		},
-		{
-			name: "methods only",
-			params: ListAPIShieldOperationsParams{
-				APIShieldListOperationsFilters: APIShieldListOperationsFilters{
-					Methods: []string{"GET", "PUT"},
-				},
-			},
-			expectedParams: url.Values{
-				"method": []string{"GET", "PUT"},
-			},
-		},
-		{
-			name: "endpoint only",
-			params: ListAPIShieldOperationsParams{
-				APIShieldListOperationsFilters: APIShieldListOperationsFilters{
-					Endpoint: "/client",
-				},
-			},
-			expectedParams: url.Values{
-				"endpoint": []string{"/client"},
-			},
-		},
-		{
-			name: "pagination only",
-			params: ListAPIShieldOperationsParams{
-				PaginationOptions: PaginationOptions{
-					Page:    1,
-					PerPage: 25,
-				},
-			},
-			expectedParams: url.Values{
-				"page":     []string{"1"},
-				"per_page": []string{"25"},
-			},
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			setup()
-			t.Cleanup(teardown)
-			handler := func(w http.ResponseWriter, r *http.Request) {
-				require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-				require.Equal(t, test.expectedParams, r.URL.Query())
-				w.Header().Set("content-type", "application/json")
-				fmt.Fprint(w, response)
-			}
-
-			mux.HandleFunc(endpoint, handler)
-
-			actual, _, err := client.ListAPIShieldOperations(
-				context.Background(),
-				ZoneIdentifier(testZoneID),
-				test.params,
-			)
-
-			time := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-			expected := []APIShieldOperation{
-				{
-					APIShieldBasicOperation: APIShieldBasicOperation{
-						Method:   "POST",
-						Host:     "api.cloudflare.com",
-						Endpoint: "/client/v4/zones",
-					},
-					ID:          "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-					LastUpdated: &time,
-					Features: map[string]any{
-						"thresholds": map[string]any{},
-					},
-				},
-			}
-
-			if assert.NoError(t, err) {
-				assert.Equal(t, expected, actual)
-			}
-		})
-	}
-}
-
-func TestCreateAPIShieldOperations(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/operations", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": [
-			{
-				"operation_id": "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-				"method": "POST",
-				"host": "api.cloudflare.com",
-				"endpoint": "/client/v4/zones",
-				"last_updated": "2023-03-02T15:46:06.000000Z"
-			}
-		]
-	}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
-
-		body, err := io.ReadAll(r.Body)
-		require.NoError(t, err)
-		require.Equal(t, []byte(`[{"method":"POST","host":"api.cloudflare.com","endpoint":"/client/v4/zones"}]`), body)
-
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.CreateAPIShieldOperations(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		CreateAPIShieldOperationsParams{
-			Operations: []APIShieldBasicOperation{
-				{
-					Method:   "POST",
-					Host:     "api.cloudflare.com",
-					Endpoint: "/client/v4/zones",
-				},
-			},
-		},
-	)
-
-	time := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-	expected := []APIShieldOperation{
-		{
-			APIShieldBasicOperation: APIShieldBasicOperation{
-				Method:   "POST",
-				Host:     "api.cloudflare.com",
-				Endpoint: "/client/v4/zones",
-			},
-			ID:          "9def2cb0-3ed0-4737-92ca-f09efa4718fd",
-			LastUpdated: &time,
-			Features:    nil,
-		},
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-}
-
-func TestDeleteAPIShieldOperation(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/operations/%s", testZoneID, testAPIShieldOperationId)
-	response := `{"result":{},"success":true,"errors":[],"messages":[]}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	err := client.DeleteAPIShieldOperation(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		DeleteAPIShieldOperationParams{
-			OperationID: testAPIShieldOperationId,
-		},
-	)
-
-	assert.NoError(t, err)
-}
diff --git a/api_shield_schemas_test.go b/api_shield_schemas_test.go
deleted file mode 100644
index 00514eaa6..000000000
--- a/api_shield_schemas_test.go
+++ /dev/null
@@ -1,669 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"errors"
-	"fmt"
-	"io"
-	"mime"
-	"mime/multipart"
-	"net/http"
-	"net/url"
-	"strings"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-)
-
-const testAPIShieldSchemaId = "0f05e4fc-1c36-4bd2-a5e7-b29d32d3dc8e"
-
-func TestGetAPIShieldSchema(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/user_schemas/%s", testZoneID, testAPIShieldSchemaId)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"schema_id": "0f05e4fc-1c36-4bd2-a5e7-b29d32d3dc8e",
-			"name": "petstore.json",
-			"kind": "openapi_v3",
-			"created_at": "2023-03-02T15:46:06.000000Z",
-			"validation_enabled": true,
-			"source": "{}"
-		}
-	}`
-
-	tests := []struct {
-		name           string
-		getParams      GetAPIShieldSchemaParams
-		expectedParams url.Values
-	}{
-		{
-			name: "without omit source",
-			getParams: GetAPIShieldSchemaParams{
-				SchemaID: testAPIShieldSchemaId,
-			},
-			expectedParams: url.Values{},
-		},
-		{
-			name: "with omit source=true",
-			getParams: GetAPIShieldSchemaParams{
-				SchemaID:   testAPIShieldSchemaId,
-				OmitSource: BoolPtr(true),
-			},
-			expectedParams: url.Values{
-				"omit_source": []string{"true"},
-			},
-		},
-		{
-			name: "with omit source=false",
-			getParams: GetAPIShieldSchemaParams{
-				SchemaID:   testAPIShieldSchemaId,
-				OmitSource: BoolPtr(false),
-			},
-			expectedParams: url.Values{
-				"omit_source": []string{"false"},
-			},
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			setup()
-			t.Cleanup(teardown)
-			handler := func(w http.ResponseWriter, r *http.Request) {
-				require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-				require.Equal(t, test.expectedParams, r.URL.Query())
-				w.Header().Set("content-type", "application/json")
-				fmt.Fprint(w, response)
-			}
-
-			mux.HandleFunc(endpoint, handler)
-
-			actual, err := client.GetAPIShieldSchema(
-				context.Background(),
-				ZoneIdentifier(testZoneID),
-				test.getParams,
-			)
-
-			createdAt := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-			expected := &APIShieldSchema{
-				ID:                testAPIShieldSchemaId,
-				Name:              "petstore.json",
-				Kind:              "openapi_v3",
-				Source:            "{}",
-				CreatedAt:         &createdAt,
-				ValidationEnabled: true,
-			}
-
-			if assert.NoError(t, err) {
-				assert.Equal(t, expected, actual)
-			}
-		})
-	}
-}
-
-func TestListAPIShieldSchemas(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/user_schemas", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": [
-			{
-				"schema_id": "0f05e4fc-1c36-4bd2-a5e7-b29d32d3dc8e",
-				"name": "petstore.json",
-				"kind": "openapi_v3",
-				"created_at": "2023-03-02T15:46:06.000000Z",
-				"validation_enabled": true,
-				"source": "{}"
-			}
-		],
-		"result_info": {
-			"page": 3,
-			"per_page": 20,
-			"count": 1,
-			"total_count": 2000
-		}
-	}`
-
-	tests := []struct {
-		name           string
-		getParams      ListAPIShieldSchemasParams
-		expectedParams url.Values
-	}{
-		{
-			name:           "with empty params",
-			getParams:      ListAPIShieldSchemasParams{},
-			expectedParams: url.Values{},
-		},
-		{
-			name: "all params",
-			getParams: ListAPIShieldSchemasParams{
-				OmitSource:        BoolPtr(true),
-				ValidationEnabled: BoolPtr(false),
-				PaginationOptions: PaginationOptions{
-					Page:    1,
-					PerPage: 25,
-				},
-			},
-			expectedParams: url.Values{
-				"omit_source":        []string{"true"},
-				"validation_enabled": []string{"false"},
-				"page":               []string{"1"},
-				"per_page":           []string{"25"},
-			},
-		},
-		{
-			name: "with omit source",
-			getParams: ListAPIShieldSchemasParams{
-				OmitSource: BoolPtr(true),
-			},
-			expectedParams: url.Values{
-				"omit_source": []string{"true"},
-			},
-		},
-		{
-			name: "with validation enabled",
-			getParams: ListAPIShieldSchemasParams{
-				ValidationEnabled: BoolPtr(true),
-			},
-			expectedParams: url.Values{
-				"validation_enabled": []string{"true"},
-			},
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			setup()
-			t.Cleanup(teardown)
-			handler := func(w http.ResponseWriter, r *http.Request) {
-				require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-				require.Equal(t, test.expectedParams, r.URL.Query())
-				w.Header().Set("content-type", "application/json")
-				fmt.Fprint(w, response)
-			}
-
-			mux.HandleFunc(endpoint, handler)
-
-			actual, resultInfo, err := client.ListAPIShieldSchemas(
-				context.Background(),
-				ZoneIdentifier(testZoneID),
-				test.getParams,
-			)
-
-			createdAt := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-			expected := []APIShieldSchema{
-				{
-					ID:                testAPIShieldSchemaId,
-					Name:              "petstore.json",
-					Kind:              "openapi_v3",
-					Source:            "{}",
-					CreatedAt:         &createdAt,
-					ValidationEnabled: true,
-				},
-			}
-
-			if assert.NoError(t, err) {
-				assert.Equal(t, expected, actual)
-
-				expectedResultInfo := ResultInfo{
-					Page:    3,
-					PerPage: 20,
-					Count:   1,
-					Total:   2000,
-				}
-				assert.Equal(t, expectedResultInfo, resultInfo)
-			}
-		})
-	}
-}
-
-func TestDeleteAPIShieldSchema(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/user_schemas/%s", testZoneID, testAPIShieldSchemaId)
-	response := `{"result":{},"success":true,"errors":[],"messages":[]}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	err := client.DeleteAPIShieldSchema(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		DeleteAPIShieldSchemaParams{
-			SchemaID: testAPIShieldSchemaId,
-		},
-	)
-
-	assert.NoError(t, err)
-}
-
-func TestUpdateAPIShieldSchema(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/user_schemas/%s", testZoneID, testAPIShieldSchemaId)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"schema_id": "0f05e4fc-1c36-4bd2-a5e7-b29d32d3dc8e",
-			"name": "petstore.json",
-			"kind": "openapi_v3",
-			"validation_enabled": true
-		}
-	}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-
-		body, err := io.ReadAll(r.Body)
-		require.NoError(t, err)
-		require.Equal(t, `{"validation_enabled":true}`, string(body))
-
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.UpdateAPIShieldSchema(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		UpdateAPIShieldSchemaParams{
-			SchemaID:          testAPIShieldSchemaId,
-			ValidationEnabled: BoolPtr(true),
-		},
-	)
-
-	// patch result is a cut down representation of the schema
-	// so metadata like created date is not populated
-	expected := &APIShieldSchema{
-		ID:                testAPIShieldSchemaId,
-		Name:              "petstore.json",
-		Kind:              "openapi_v3",
-		ValidationEnabled: true,
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-
-	assert.NoError(t, err)
-}
-
-func TestCreateAPIShieldSchema(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/user_schemas", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"schema": {
-				"schema_id": "0f05e4fc-1c36-4bd2-a5e7-b29d32d3dc8e",
-				"name": "petstore.json",
-				"kind": "openapi_v3",
-				"created_at": "2023-03-02T15:46:06.000000Z",
-				"validation_enabled": true,
-				"source": "{}"
-			},
-			"upload_details": {
-				"warnings": [
-					{
-						"code": 28,
-						"message": "unsupported media type: application/octet-stream",
-						"locations": [
-							".paths[\"/user/{username}\"].put"
-						]
-					}
-				]
-			}
-		}
-	}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
-
-		// Check that form data has been sent correctly.
-		mediaType, params, err := mime.ParseMediaType(r.Header.Get("Content-Type"))
-		require.NoError(t, err)
-		require.True(t, strings.HasPrefix(mediaType, "multipart/form-data"))
-
-		expectedParts := []struct {
-			partKeys map[string]string
-			data     []byte
-		}{
-			{
-				partKeys: map[string]string{"name": "name"},
-				data:     []byte("petstore.json"),
-			},
-			{
-				partKeys: map[string]string{"name": "kind"},
-				data:     []byte("openapi_v3"),
-			},
-			{
-				partKeys: map[string]string{"name": "validation_enabled"},
-				data:     []byte("true"),
-			},
-			{
-				partKeys: map[string]string{"filename": "petstore.json", "name": "file"},
-				data:     []byte("{}"),
-			},
-		}
-
-		multiPartReader := multipart.NewReader(r.Body, params["boundary"])
-		partNum := 0
-		for {
-			part, err := multiPartReader.NextPart()
-			if errors.Is(err, io.EOF) {
-				break
-			}
-			require.NoError(t, err)
-
-			// more parts found - this is unexpected
-			require.Less(t, partNum, len(expectedParts))
-
-			value, err := io.ReadAll(part)
-			require.NoError(t, err)
-
-			_, dParams, err := mime.ParseMediaType(part.Header.Get("Content-Disposition"))
-			require.NoError(t, err)
-
-			require.Equal(t, expectedParts[partNum].partKeys, dParams)
-			require.Equal(t, expectedParts[partNum].data, value)
-			partNum++
-		}
-
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.CreateAPIShieldSchema(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		CreateAPIShieldSchemaParams{
-			Name:              "petstore.json",
-			Kind:              "openapi_v3",
-			Source:            strings.NewReader("{}"),
-			ValidationEnabled: BoolPtr(true),
-		},
-	)
-
-	createdAt := time.Date(2023, time.March, 2, 15, 46, 6, 0, time.UTC)
-	expected := &APIShieldCreateSchemaResult{
-		Schema: APIShieldSchema{
-			ID:                testAPIShieldSchemaId,
-			Name:              "petstore.json",
-			Kind:              "openapi_v3",
-			Source:            "{}",
-			CreatedAt:         &createdAt,
-			ValidationEnabled: true,
-		},
-		Events: APIShieldCreateSchemaEvents{
-			Warnings: []APIShieldCreateSchemaEventWithLocations{
-				{
-					APIShieldCreateSchemaEvent: APIShieldCreateSchemaEvent{
-						Code:    28,
-						Message: "unsupported media type: application/octet-stream",
-					},
-					Locations: []string{
-						".paths[\"/user/{username}\"].put",
-					},
-				},
-			},
-		},
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-}
-
-func TestCreateAPIShieldSchemaError(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/user_schemas", testZoneID)
-	response := `{
-		"success" : false,
-		"errors": [
-			{
-			  "code": 21400,
-			  "message": "only default parameter styles are supported: path, form (.paths[\"/pet/{petId}\"].get.parameters[0])"
-			}
-		],
-		"messages": [],
-		"result": {
-			"upload_details": {
-				"errors": [
-					{
-						"code": 22,
-						"message": "only default parameter styles are supported: path, form",
-						"locations": [
-							".paths[\"/pet/{petId}\"].get.parameters[0]"
-						]
-					}
-				]
-			}
-		}
-	}`
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		w.WriteHeader(400)
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	_, err := client.CreateAPIShieldSchema(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		CreateAPIShieldSchemaParams{
-			Name:              "petstore.json",
-			Kind:              "openapi_v3",
-			Source:            strings.NewReader("{}"),
-			ValidationEnabled: BoolPtr(true),
-		},
-	)
-
-	require.ErrorContains(t, err, "only default parameter styles are supported: path, form (.paths[\"/pet/{petId}\"].get.parameters[0]) (21400)")
-}
-
-func TestMustProvideSchemaID(t *testing.T) {
-	setup()
-	t.Cleanup(teardown)
-
-	_, err := client.GetAPIShieldSchema(context.Background(), ZoneIdentifier(testZoneID), GetAPIShieldSchemaParams{})
-	require.ErrorContains(t, err, "schema ID must be provided")
-
-	_, err = client.UpdateAPIShieldSchema(context.Background(), ZoneIdentifier(testZoneID), UpdateAPIShieldSchemaParams{})
-	require.ErrorContains(t, err, "schema ID must be provided")
-
-	err = client.DeleteAPIShieldSchema(context.Background(), ZoneIdentifier(testZoneID), DeleteAPIShieldSchemaParams{})
-	require.ErrorContains(t, err, "schema ID must be provided")
-}
-
-func TestGetAPIShieldSchemaValidationSettings(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/settings/schema_validation", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"validation_default_mitigation_action": "log",
-			"validation_override_mitigation_action": "none"
-		}
-	}`
-
-	setup()
-	t.Cleanup(teardown)
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.GetAPIShieldSchemaValidationSettings(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-	)
-
-	none := "none"
-	expected := &APIShieldSchemaValidationSettings{
-		DefaultMitigationAction:  "log",
-		OverrideMitigationAction: &none,
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-}
-
-func TestUpdateAPIShieldSchemaValidationSettings(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/settings/schema_validation", testZoneID)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"validation_default_mitigation_action": "log",
-			"validation_override_mitigation_action": null
-		}
-	}`
-
-	setup()
-	t.Cleanup(teardown)
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.UpdateAPIShieldSchemaValidationSettings(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		UpdateAPIShieldSchemaValidationSettingsParams{}, // specifying nil is ok for fields
-	)
-
-	expected := &APIShieldSchemaValidationSettings{
-		DefaultMitigationAction:  "log",
-		OverrideMitigationAction: nil,
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-}
-
-func TestGetAPIShieldOperationSchemaValidationSettings(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/operations/%s/schema_validation", testZoneID, testAPIShieldOperationId)
-	response := `{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"mitigation_action": "log"
-		}
-	}`
-
-	setup()
-	t.Cleanup(teardown)
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.GetAPIShieldOperationSchemaValidationSettings(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		GetAPIShieldOperationSchemaValidationSettingsParams{OperationID: testAPIShieldOperationId},
-	)
-
-	log := "log"
-	expected := &APIShieldOperationSchemaValidationSettings{
-		MitigationAction: &log,
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-}
-
-func TestUpdateAPIShieldOperationSchemaValidationSettings(t *testing.T) {
-	endpoint := fmt.Sprintf("/zones/%s/api_gateway/operations/schema_validation", testZoneID)
-	response := fmt.Sprintf(`{
-		"success" : true,
-		"errors": [],
-		"messages": [],
-		"result": {
-			"%s": null
-		}
-	}`, testAPIShieldOperationId)
-
-	setup()
-	t.Cleanup(teardown)
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		require.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
-		require.Empty(t, r.URL.Query())
-
-		body, err := io.ReadAll(r.Body)
-		require.NoError(t, err)
-		expected := fmt.Sprintf(`{"%s":{"mitigation_action":null}}`, testAPIShieldOperationId)
-		require.Equal(t, expected, string(body))
-
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprint(w, response)
-	}
-
-	mux.HandleFunc(endpoint, handler)
-
-	actual, err := client.UpdateAPIShieldOperationSchemaValidationSettings(
-		context.Background(),
-		ZoneIdentifier(testZoneID),
-		UpdateAPIShieldOperationSchemaValidationSettings{
-			testAPIShieldOperationId: APIShieldOperationSchemaValidationSettings{
-				MitigationAction: nil,
-			},
-		},
-	)
-
-	expected := &UpdateAPIShieldOperationSchemaValidationSettings{
-		testAPIShieldOperationId: APIShieldOperationSchemaValidationSettings{
-			MitigationAction: nil,
-		},
-	}
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, expected, actual)
-	}
-}
diff --git a/custom_nameservers_test.go b/custom_nameservers_test.go
index 423205cac..e1b51fa16 100644
--- a/custom_nameservers_test.go
+++ b/custom_nameservers_test.go
@@ -196,7 +196,8 @@ func TestAccountCustomNameserver_GetAccountCustomNameserverZoneMetadata(t *testi
 		w.Header().Set("content-type", "application/json")
 		fmt.Fprintf(w, `{
 			"result": {
-				"ns_set": 1,
+				"type": "account",
+				"ns_set": "1",
 				"enabled": true
 			},
 			"success": true,
@@ -207,7 +208,8 @@ func TestAccountCustomNameserver_GetAccountCustomNameserverZoneMetadata(t *testi
 
 	mux.HandleFunc("/zones/"+testZoneID+"/custom_ns", handler)
 	want := CustomNameserverZoneMetadata{
-		NSSet:   1,
+		Type:    "account",
+		NSSet:   "1",
 		Enabled: true,
 	}
 
diff --git a/d1_test.go b/d1_test.go
deleted file mode 100644
index 1f3c5399a..000000000
--- a/d1_test.go
+++ /dev/null
@@ -1,238 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"net/http"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-)
-
-const (
-	testD1DatabaseID = "480f4f691a284fdd92401ed29f0ac1df"
-	testD1Result     = `{
-		  "created_at": "2014-01-01T05:20:00.12345Z",
-		  "name": "my-database",
-		  "uuid": "480f4f691a284fdd92401ed29f0ac1df",
-		  "version": "beta",
-		  "num_tables": 1,
-		  "file_size": 100
-		}
-`
-)
-
-var (
-	d1CreatedAt, _ = time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-	testD1Database = D1Database{
-		Name:      "my-database",
-		NumTables: 1,
-		UUID:      testD1DatabaseID,
-		Version:   "beta",
-		CreatedAt: &d1CreatedAt,
-		FileSize:  100,
-	}
-)
-
-func TestListD1Databases(t *testing.T) {
-	setup()
-	defer teardown()
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/d1/database", func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-            "success": true,
-            "errors": [],
-            "messages": [],
-            "result": [
-                %s
-            ],
-            "result_info": {
-                "page": 1,
-                "per_page": 100,
-                "count": 1,
-                "total_count": 1
-            }
-        }`, testD1Result)
-	})
-
-	_, _, err := client.ListD1Databases(context.Background(), AccountIdentifier(""), ListD1DatabasesParams{})
-	if assert.Error(t, err, "Didn't get error for missing Account ID get listing D1 Database") {
-		assert.Equal(t, err.Error(), errMissingAccountID)
-	}
-	actual, _, err := client.ListD1Databases(context.Background(), testAccountRC, ListD1DatabasesParams{})
-	if assert.NoError(t, err, "ListD1Databases returned error: %v", err) {
-		expected := []D1Database{testD1Database}
-		if !assert.Equal(t, expected, actual) {
-			t.Errorf("ListD1Databases returned %+v, expected %+v", actual, expected)
-		}
-	}
-}
-
-func TestGetD1Databases(t *testing.T) {
-	setup()
-	defer teardown()
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/d1/database/"+testD1DatabaseID, func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-            "success": true,
-            "errors": [],
-            "messages": [],
-            "result": %s
-        }`, testD1Result)
-	})
-
-	_, err := client.GetD1Database(context.Background(), AccountIdentifier(""), "")
-	if assert.Error(t, err, "Didn't get error for missing Account ID get getting D1 Database") {
-		assert.Equal(t, err.Error(), errMissingAccountID)
-	}
-	actual, err := client.GetD1Database(context.Background(), testAccountRC, testD1DatabaseID)
-	if assert.NoError(t, err, "GetD1Database returned error: %v", err) {
-		if !assert.Equal(t, testD1Database, actual) {
-			t.Errorf("GetD1Database returned %+v, expected %+v", actual, testD1Database)
-		}
-	}
-}
-
-func TestCreateD1Database(t *testing.T) {
-	setup()
-	defer teardown()
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/d1/database", func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			"result": %s
-		}`, testD1Result)
-	})
-
-	_, err := client.CreateD1Database(context.Background(), AccountIdentifier(""), CreateD1DatabaseParams{})
-	if assert.Error(t, err, "Didn't get error for missing Account ID get creating D1 Database") {
-		assert.Equal(t, err.Error(), errMissingAccountID)
-	}
-	actual, err := client.CreateD1Database(context.Background(), testAccountRC, CreateD1DatabaseParams{
-		Name: "my-database",
-	})
-	if assert.NoError(t, err, "CreateD1Database returned error: %v", err) {
-		if !assert.Equal(t, testD1Database, actual) {
-			t.Errorf("CreateD1Database returned %+v, expected %+v", actual, testD1Database)
-		}
-	}
-}
-
-func TestDeleteD1Database(t *testing.T) {
-	setup()
-	defer teardown()
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/d1/database/"+testD1DatabaseID, func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": []
-		}`)
-	})
-
-	err := client.DeleteD1Database(context.Background(), AccountIdentifier(""), "")
-	if assert.Error(t, err, "Didn't get error for missing Account ID get deleting D1 Database") {
-		assert.Equal(t, err.Error(), errMissingAccountID)
-	}
-	err = client.DeleteD1Database(context.Background(), testAccountRC, testD1DatabaseID)
-	assert.NoError(t, err, "DeleteD1Database returned error: %v", err)
-}
-
-func TestQueryD1Database(t *testing.T) {
-	setup()
-	defer teardown()
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/d1/database/"+testD1DatabaseID+"/query", func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		b, err := io.ReadAll(r.Body)
-		if err != nil {
-			t.Errorf("Error reading request body: %v", err)
-		}
-		if got := string(b); got != `{"sql":"SELECT * FROM my-database","params":["param1","param2"]}` {
-			t.Errorf("request Body is %s, want %s", got, `{"sql":"SELECT * FROM my-database","params":["param1","param2"]}`)
-		}
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			"result": [
-				{
-					"success": true,
-					"meta": {
-						"changed_db": false,
-						"changes": 0,
-						"duration": 3.3,
-						"last_row_id": 3,
-						"rows_read": 3,
-						"rows_written": 0,
-						"size_after": 10
-					},
-					"results": [
-						{
-							"id": 1,
-							"name": "test user"
-						},
-						{
-							"id": 2,
-							"name": "test user 2"
-						}
-					]
-				}
-			]
-		}`)
-	})
-
-	_, err := client.QueryD1Database(context.Background(), AccountIdentifier(""), QueryD1DatabaseParams{})
-	if assert.Error(t, err, "Didn't get error for missing Account ID get querying D1 Database") {
-		assert.Equal(t, err, ErrMissingAccountID)
-	}
-	_, err = client.QueryD1Database(context.Background(), testAccountRC, QueryD1DatabaseParams{})
-	if assert.Error(t, err, "Didn't get error for missing D1 Database ID get querying D1 Database") {
-		assert.Equal(t, err, ErrMissingDatabaseID)
-	}
-	actual, err := client.QueryD1Database(context.Background(), testAccountRC, QueryD1DatabaseParams{
-		DatabaseID: testD1DatabaseID,
-		SQL:        "SELECT * FROM my-database",
-		Parameters: []string{"param1", "param2"},
-	})
-	if assert.NoError(t, err, "QueryD1Database returned error: %v", err) {
-		expected := D1Result{
-			Success: BoolPtr(true),
-			Meta: D1DatabaseMetadata{
-				ChangedDB:   BoolPtr(false),
-				Changes:     0,
-				Duration:    3.3,
-				LastRowID:   3,
-				RowsRead:    3,
-				RowsWritten: 0,
-				SizeAfter:   10,
-			},
-			Results: []map[string]any{
-				{
-					"id":   float64(1),
-					"name": "test user",
-				},
-				{
-					"id":   float64(2),
-					"name": "test user 2",
-				},
-			},
-		}
-		if !assert.Equal(t, expected, actual[0]) {
-			t.Errorf("QueryD1Database returned %+v, expected %+v", actual, expected)
-		}
-	}
-}
diff --git a/devices_policy_test.go b/devices_policy_test.go
index b08e45226..de29cc0a6 100644
--- a/devices_policy_test.go
+++ b/devices_policy_test.go
@@ -150,7 +150,7 @@ var (
 	}`, deviceSettingsPolicyID, deviceSettingsPolicyMatch)
 )
 
-func TestUpdateDeviceClientCertificates(t *testing.T) {
+func TestUpdateDeviceClientCertificatesZone(t *testing.T) {
 	setup()
 	defer teardown()
 
@@ -165,7 +165,7 @@ func TestUpdateDeviceClientCertificates(t *testing.T) {
 		}`)
 	}
 
-	want := DeviceClientCertificates{
+	want := DeviceClientCertificatesZone{
 		Response: Response{
 			Success:  true,
 			Errors:   nil,
@@ -176,14 +176,14 @@ func TestUpdateDeviceClientCertificates(t *testing.T) {
 
 	mux.HandleFunc("/zones/"+testZoneID+"/devices/policy/certificates", handler)
 
-	actual, err := client.UpdateDeviceClientCertificates(context.Background(), ZoneIdentifier(testZoneID), UpdateDeviceClientCertificatesParams{Enabled: BoolPtr(true)})
+	actual, err := client.UpdateDeviceClientCertificatesZone(context.Background(), testZoneID, true)
 
 	if assert.NoError(t, err) {
 		assert.Equal(t, want, actual)
 	}
 }
 
-func TestGetDeviceClientCertificates(t *testing.T) {
+func TestGetDeviceClientCertificatesZone(t *testing.T) {
 	setup()
 	defer teardown()
 
@@ -198,7 +198,7 @@ func TestGetDeviceClientCertificates(t *testing.T) {
 		}`)
 	}
 
-	want := DeviceClientCertificates{
+	want := DeviceClientCertificatesZone{
 		Response: Response{
 			Success:  true,
 			Errors:   nil,
@@ -209,7 +209,7 @@ func TestGetDeviceClientCertificates(t *testing.T) {
 
 	mux.HandleFunc("/zones/"+testZoneID+"/devices/policy/certificates", handler)
 
-	actual, err := client.GetDeviceClientCertificates(context.Background(), ZoneIdentifier(testZoneID), GetDeviceClientCertificatesParams{})
+	actual, err := client.GetDeviceClientCertificatesZone(context.Background(), testZoneID)
 
 	if assert.NoError(t, err) {
 		assert.Equal(t, want, actual)
@@ -231,9 +231,18 @@ func TestCreateDeviceSettingsPolicy(t *testing.T) {
 		}`, nonDefaultDeviceSettingsPolicyJson)
 	}
 
+	want := DeviceSettingsPolicyResponse{
+		Response: Response{
+			Success:  true,
+			Errors:   nil,
+			Messages: nil,
+		},
+		Result: nonDefaultDeviceSettingsPolicy,
+	}
+
 	mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy", handler)
 
-	actual, err := client.CreateDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), CreateDeviceSettingsPolicyParams{
+	actual, err := client.CreateDeviceSettingsPolicy(context.Background(), testAccountID, DeviceSettingsPolicyRequest{
 		Precedence:  IntPtr(10),
 		Match:       &deviceSettingsPolicyMatch,
 		Name:        StringPtr("test"),
@@ -241,7 +250,7 @@ func TestCreateDeviceSettingsPolicy(t *testing.T) {
 	})
 
 	if assert.NoError(t, err) {
-		assert.Equal(t, nonDefaultDeviceSettingsPolicy, actual)
+		assert.Equal(t, want, actual)
 	}
 }
 
@@ -260,12 +269,21 @@ func TestUpdateDefaultDeviceSettingsPolicy(t *testing.T) {
 		}`, defaultDeviceSettingsPolicyJson)
 	}
 
+	want := DeviceSettingsPolicyResponse{
+		Response: Response{
+			Success:  true,
+			Errors:   nil,
+			Messages: nil,
+		},
+		Result: defaultDeviceSettingsPolicy,
+	}
+
 	mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy", handler)
 
-	actual, err := client.UpdateDefaultDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), UpdateDefaultDeviceSettingsPolicyParams{})
+	actual, err := client.UpdateDefaultDeviceSettingsPolicy(context.Background(), testAccountID, DeviceSettingsPolicyRequest{})
 
 	if assert.NoError(t, err) {
-		assert.Equal(t, defaultDeviceSettingsPolicy, actual)
+		assert.Equal(t, want, actual)
 	}
 }
 
@@ -285,16 +303,23 @@ func TestUpdateDeviceSettingsPolicy(t *testing.T) {
 	}
 
 	precedence := 10
+	want := DeviceSettingsPolicyResponse{
+		Response: Response{
+			Success:  true,
+			Errors:   nil,
+			Messages: nil,
+		},
+		Result: nonDefaultDeviceSettingsPolicy,
+	}
 
 	mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy/"+deviceSettingsPolicyID, handler)
 
-	actual, err := client.UpdateDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), UpdateDeviceSettingsPolicyParams{
-		PolicyID:   &deviceSettingsPolicyID,
+	actual, err := client.UpdateDeviceSettingsPolicy(context.Background(), testAccountID, deviceSettingsPolicyID, DeviceSettingsPolicyRequest{
 		Precedence: &precedence,
 	})
 
 	if assert.NoError(t, err) {
-		assert.Equal(t, nonDefaultDeviceSettingsPolicy, actual)
+		assert.Equal(t, want, actual)
 	}
 }
 
@@ -313,12 +338,21 @@ func TestDeleteDeviceSettingsPolicy(t *testing.T) {
 		}`, defaultDeviceSettingsPolicyJson)
 	}
 
+	want := DeleteDeviceSettingsPolicyResponse{
+		Response: Response{
+			Success:  true,
+			Errors:   nil,
+			Messages: nil,
+		},
+		Result: []DeviceSettingsPolicy{defaultDeviceSettingsPolicy},
+	}
+
 	mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy/"+deviceSettingsPolicyID, handler)
 
-	actual, err := client.DeleteDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), deviceSettingsPolicyID)
+	actual, err := client.DeleteDeviceSettingsPolicy(context.Background(), testAccountID, deviceSettingsPolicyID)
 
 	if assert.NoError(t, err) {
-		assert.Equal(t, []DeviceSettingsPolicy{defaultDeviceSettingsPolicy}, actual)
+		assert.Equal(t, want, actual)
 	}
 }
 
@@ -337,12 +371,21 @@ func TestGetDefaultDeviceSettings(t *testing.T) {
 		}`, defaultDeviceSettingsPolicyJson)
 	}
 
+	want := DeviceSettingsPolicyResponse{
+		Response: Response{
+			Success:  true,
+			Errors:   nil,
+			Messages: nil,
+		},
+		Result: defaultDeviceSettingsPolicy,
+	}
+
 	mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy", handler)
 
-	actual, err := client.GetDefaultDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), GetDefaultDeviceSettingsPolicyParams{})
+	actual, err := client.GetDefaultDeviceSettingsPolicy(context.Background(), testAccountID)
 
 	if assert.NoError(t, err) {
-		assert.Equal(t, defaultDeviceSettingsPolicy, actual)
+		assert.Equal(t, want, actual)
 	}
 }
 
@@ -361,55 +404,20 @@ func TestGetDeviceSettings(t *testing.T) {
 		}`, nonDefaultDeviceSettingsPolicyJson)
 	}
 
-	mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy/"+deviceSettingsPolicyID, handler)
-
-	actual, err := client.GetDeviceSettingsPolicy(context.Background(), AccountIdentifier(testAccountID), GetDeviceSettingsPolicyParams{PolicyID: &deviceSettingsPolicyID})
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, nonDefaultDeviceSettingsPolicy, actual)
-	}
-}
-
-func TestListDeviceSettingsPolicies(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": null,
-			"messages": null,
-			"result": [%s],
-			"result_info": {
-  				"count": 1,
-  				"page": 1,
-  				"per_page": 20,
-  				"total_count": 1
-			}
-		}`, nonDefaultDeviceSettingsPolicyJson)
+	want := DeviceSettingsPolicyResponse{
+		Response: Response{
+			Success:  true,
+			Errors:   nil,
+			Messages: nil,
+		},
+		Result: nonDefaultDeviceSettingsPolicy,
 	}
 
-	want := []DeviceSettingsPolicy{nonDefaultDeviceSettingsPolicy}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/devices/policies", handler)
+	mux.HandleFunc("/accounts/"+testAccountID+"/devices/policy/"+deviceSettingsPolicyID, handler)
 
-	actual, resultInfo, err := client.ListDeviceSettingsPolicies(context.Background(), AccountIdentifier(testAccountID), ListDeviceSettingsPoliciesParams{
-		ResultInfo: ResultInfo{
-			Page:    1,
-			PerPage: 20,
-		},
-	})
+	actual, err := client.GetDeviceSettingsPolicy(context.Background(), testAccountID, deviceSettingsPolicyID)
 
 	if assert.NoError(t, err) {
 		assert.Equal(t, want, actual)
-		assert.Equal(t, &ResultInfo{
-			Count:   1,
-			Page:    1,
-			PerPage: 20,
-			Total:   1,
-		}, resultInfo)
-		assert.Len(t, actual, 1)
 	}
 }
diff --git a/observatory_test.go b/observatory_test.go
deleted file mode 100644
index fa897141d..000000000
--- a/observatory_test.go
+++ /dev/null
@@ -1,464 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"net/http"
-	"net/url"
-	"strings"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-)
-
-var testURL = "example.com/a/b"
-var escapedTestURL = url.PathEscape(testURL)
-var region = "us-central1"
-var regionLabel = "Iowa, USA"
-var frequency = "DAILY"
-var observatoryTestID = "52cc96c9-b709-4ffe-9048-338853d3db46"
-var date = time.Now().UTC()
-
-var pageJSON = fmt.Sprintf(`
-{
-  "url": "%[1]s",
-  "region": {
-    "value": "%[2]s",
-    "label": "%[3]s"
-  },
-  "scheduleFrequency": "%[4]s",
-  "tests": [
-    {
-      "id": "%[5]s",
-      "date": "%[6]s",
-      "url": "%[1]s",
-      "scheduleFrequency": "%[4]s",
-      "region": {
-        "value": "%[2]s",
-        "label": "%[3]s"
-      },
-      "mobileReport": {
-        "performanceScore": 100,
-        "ttfb": 10,
-        "fcp": 10,
-        "lcp": 10,
-        "tti": 10,
-        "tbt": 10,
-        "si": 10,
-        "cls": 0.10,
-        "state": "COMPLETED",
-        "deviceType": "DESKTOP"
-      },
-      "desktopReport": {
-        "performanceScore": 100,
-        "ttfb": 10,
-        "fcp": 10,
-        "lcp": 10,
-        "tti": 10,
-        "tbt": 10,
-        "si": 10,
-        "cls": 0.10,
-        "state": "COMPLETED",
-        "deviceType": "DESKTOP"
-      }
-    }
-  ]
-}`, testURL, region, regionLabel, frequency, observatoryTestID, date.Format(time.RFC3339Nano))
-
-var scheduledPageTestJSON = fmt.Sprintf(`
-{
-  "schedule": {
-    "url": "%[1]s",
-    "region": "%[2]s",
-    "frequency": "%[3]s"
-  },
-  "test": %[4]s
-}
-`, testURL, region, frequency, pageTestJSON)
-
-var scheduleJSON = fmt.Sprintf(`
-{
-  "url": "%[1]s",
-  "region": "%[2]s",
-  "frequency": "%[3]s"
-}
-`, testURL, region, frequency)
-
-var pageTestJSON = fmt.Sprintf(`
-{
-  "id": "%[1]s",
-  "date": "%[2]s",
-  "url": "%[3]s",
-  "region": {
-    "value": "%[4]s",
-    "label": "%[5]s"
-  },
-  "scheduleFrequency": "%[6]s",
-  "mobileReport": %[7]s,
-  "desktopReport": %[7]s
-}`, observatoryTestID, date.Format(time.RFC3339Nano), testURL, region, regionLabel, frequency, reportJSON, reportJSON)
-
-var reportJSON = `
-{
-  "state": "COMPLETED",
-  "deviceType": "DESKTOP",
-  "performanceScore": 100,
-  "ttfb": 10,
-  "fcp": 10,
-  "lcp": 10,
-  "tti": 10,
-  "tbt": 10,
-  "si": 10,
-  "cls": 0.10
-}
-`
-
-var report = ObservatoryLighthouseReport{
-	PerformanceScore: 100,
-	State:            "COMPLETED",
-	DeviceType:       "DESKTOP",
-	TTFB:             10,
-	FCP:              10,
-	LCP:              10,
-	TTI:              10,
-	TBT:              10,
-	SI:               10,
-	CLS:              0.10,
-	Error:            nil,
-}
-
-var page = ObservatoryPage{
-	URL: testURL,
-	Region: labeledRegion{
-		Value: region,
-		Label: regionLabel,
-	},
-	ScheduleFrequency: frequency,
-	Tests: []ObservatoryPageTest{
-		pageTest,
-	},
-}
-var pageTest = ObservatoryPageTest{
-	ID:   observatoryTestID,
-	Date: &date,
-	URL:  testURL,
-	Region: labeledRegion{
-		Value: region,
-		Label: regionLabel,
-	},
-	ScheduleFrequency: &frequency,
-	MobileReport:      report,
-	DesktopReport:     report,
-}
-
-var scheduledPageTest = ObservatoryScheduledPageTest{
-	Schedule: ObservatorySchedule{
-		URL:       testURL,
-		Region:    region,
-		Frequency: frequency,
-	},
-	Test: pageTest,
-}
-
-var schedule = ObservatorySchedule{
-	URL:       testURL,
-	Region:    region,
-	Frequency: frequency,
-}
-
-func TestListObservatoryPages(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/pages", r.URL.EscapedPath())
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": [
-			    %s
-			  ]
-			}
-		`, pageJSON)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/pages", handler)
-	want := []ObservatoryPage{
-		page,
-	}
-	pages, err := client.ListObservatoryPages(context.Background(), ZoneIdentifier(testZoneID), ListObservatoryPagesParams{})
-	if assert.NoError(t, err) {
-		assert.Equal(t, want, pages)
-	}
-}
-
-func TestObservatoryPageTrend(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		assert.Equal(t, "DESKTOP", r.URL.Query().Get("deviceType"))
-		assert.Equal(t, "America/Chicago", r.URL.Query().Get("tz"))
-		assert.Equal(t, "fcp,lcp", r.URL.Query().Get("metrics"))
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/pages/"+escapedTestURL+"/trend", r.URL.EscapedPath())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": {
-			    "performanceScore": [null, 100],
-			    "ttfb": [null, 10],
-			    "fcp": [null, 10],
-			    "lcp": [null, 10],
-			    "tti": [null, 10],
-			    "tbt": [null, 10],
-			    "si": [null, 10],
-			    "cls": [null, 0.10]
-			  }
-			}
-		`)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/pages/"+testURL+"/trend", handler)
-	want := ObservatoryPageTrend{
-		PerformanceScore: []*int{nil, IntPtr(100)},
-		TTFB:             []*int{nil, IntPtr(10)},
-		FCP:              []*int{nil, IntPtr(10)},
-		LCP:              []*int{nil, IntPtr(10)},
-		TTI:              []*int{nil, IntPtr(10)},
-		TBT:              []*int{nil, IntPtr(10)},
-		SI:               []*int{nil, IntPtr(10)},
-		CLS:              []*float64{nil, Float64Ptr(0.10)},
-	}
-	trend, err := client.GetObservatoryPageTrend(context.Background(), ZoneIdentifier(testZoneID), GetObservatoryPageTrendParams{
-		URL:        testURL,
-		Region:     region,
-		DeviceType: "DESKTOP",
-		Start:      &date,
-		End:        &date,
-		Timezone:   "America/Chicago",
-		Metrics:    []string{"fcp,lcp"},
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, &want, trend)
-	}
-}
-
-func TestListObservatoryPageTests(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		assert.Equal(t, region, r.URL.Query().Get("region"))
-		assert.Equal(t, "1", r.URL.Query().Get("page"))
-		assert.Equal(t, "10", r.URL.Query().Get("per_page"))
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/pages/"+escapedTestURL+"/tests", r.URL.EscapedPath())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": [%s]
-			}
-		`, pageTestJSON)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/pages/"+testURL+"/tests", handler)
-	want := []ObservatoryPageTest{
-		pageTest,
-	}
-	tests, _, err := client.ListObservatoryPageTests(context.Background(), ZoneIdentifier(testZoneID), ListObservatoryPageTestParams{
-		URL: testURL,
-		ResultInfo: ResultInfo{
-			Page:    1,
-			PerPage: 10,
-		},
-		Region: region,
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, want, tests)
-	}
-}
-
-func TestCreateObservatoryPageTest(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
-		b, err := io.ReadAll(r.Body)
-		assert.NoError(t, err)
-		assert.True(t, strings.Contains(string(b), region))
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/pages/"+escapedTestURL+"/tests", r.URL.EscapedPath())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": %s
-			}
-		`, pageTestJSON)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/pages/"+testURL+"/tests", handler)
-	want := pageTest
-	test, err := client.CreateObservatoryPageTest(context.Background(), ZoneIdentifier(testZoneID), CreateObservatoryPageTestParams{
-		URL: testURL,
-		Settings: CreateObservatoryPageTestSettings{
-			Region: region,
-		},
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, &want, test)
-	}
-}
-
-func TestDeleteObservatoryPageTests(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method)
-		assert.Equal(t, region, r.URL.Query().Get("region"))
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/pages/"+escapedTestURL+"/tests", r.URL.EscapedPath())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": {
-                "count": 2
-              }
-			}
-		`)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/pages/"+testURL+"/tests", handler)
-	want := 2
-	count, err := client.DeleteObservatoryPageTests(context.Background(), ZoneIdentifier(testZoneID), DeleteObservatoryPageTestsParams{
-		URL:    testURL,
-		Region: region,
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, &want, count)
-	}
-}
-
-func TestGetObservatoryPageTest(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/pages/"+escapedTestURL+"/tests/"+observatoryTestID, r.URL.EscapedPath())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": %s
-			}
-		`, pageTestJSON)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/pages/"+testURL+"/tests/"+observatoryTestID, handler)
-	want := pageTest
-	test, err := client.GetObservatoryPageTest(context.Background(), ZoneIdentifier(testZoneID), GetObservatoryPageTestParams{
-		TestID: observatoryTestID,
-		URL:    testURL,
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, &want, test)
-	}
-}
-
-func TestCreateObservatoryScheduledPageTest(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
-		assert.Equal(t, frequency, r.URL.Query().Get("frequency"))
-		assert.Equal(t, region, r.URL.Query().Get("region"))
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/schedule/"+escapedTestURL, r.URL.EscapedPath())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": %s
-			}
-		`, scheduledPageTestJSON)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/schedule/"+testURL, handler)
-	want := scheduledPageTest
-	pages, err := client.CreateObservatoryScheduledPageTest(context.Background(), ZoneIdentifier(testZoneID), CreateObservatoryScheduledPageTestParams{
-		Frequency: frequency,
-		URL:       testURL,
-		Region:    region,
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, &want, pages)
-	}
-}
-
-func TestObservatoryScheduledPageTest(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		assert.Equal(t, region, r.URL.Query().Get("region"))
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/schedule/"+escapedTestURL, r.URL.EscapedPath())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": %s
-			}
-		`, scheduleJSON)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/schedule/"+testURL, handler)
-	want := schedule
-	schedule, err := client.GetObservatoryScheduledPageTest(context.Background(), ZoneIdentifier(testZoneID), GetObservatoryScheduledPageTestParams{
-		URL:    testURL,
-		Region: region,
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, &want, schedule)
-	}
-}
-
-func TestDeleteObservatoryScheduledPageTest(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method)
-		assert.Equal(t, region, r.URL.Query().Get("region"))
-		assert.Equal(t, "/zones/"+testZoneID+"/speed_api/schedule/"+escapedTestURL, r.URL.EscapedPath())
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			  "success": true,
-			  "errors": [],
-			  "messages": [],
-			  "result": { 
-                "count": 2
-              }
-			}
-		`)
-	}
-	mux.HandleFunc("/zones/"+testZoneID+"/speed_api/schedule/"+testURL, handler)
-	want := 2
-	count, err := client.DeleteObservatoryScheduledPageTest(context.Background(), ZoneIdentifier(testZoneID), DeleteObservatoryScheduledPageTestParams{
-		URL:    testURL,
-		Region: region,
-	})
-	if assert.NoError(t, err) {
-		assert.Equal(t, &want, count)
-	}
-}
diff --git a/teams_accounts_test.go b/teams_accounts_test.go
index dfd236d3e..c1dfe4be4 100644
--- a/teams_accounts_test.go
+++ b/teams_accounts_test.go
@@ -78,13 +78,6 @@ func TestTeamsAccountConfiguration(t *testing.T) {
 						"logo_path": "https://logos.com/a.png",
 						"background_color": "#ff0000",
 						"suppress_footer": true
-					},
-					"browser_isolation": {
-						"url_browser_isolation_enabled": true,
-						"non_identity_enabled": true
-          				},
-					"body_scanning": {
-						"inspection_mode": "deep"
 					}
 				}
 			}
@@ -103,7 +96,6 @@ func TestTeamsAccountConfiguration(t *testing.T) {
 			TLSDecrypt:        &TeamsTLSDecrypt{Enabled: true},
 			ProtocolDetection: &TeamsProtocolDetection{Enabled: true},
 			FIPS:              &TeamsFIPS{TLS: true},
-			BodyScanning:      &TeamsBodyScanning{InspectionMode: "deep"},
 
 			BlockPage: &TeamsBlockPage{
 				Enabled:         BoolPtr(true),
@@ -116,10 +108,6 @@ func TestTeamsAccountConfiguration(t *testing.T) {
 				MailtoSubject:   "Blocked User Inquiry",
 				SuppressFooter:  BoolPtr(true),
 			},
-			BrowserIsolation: &BrowserIsolation{
-				UrlBrowserIsolationEnabled: BoolPtr(true),
-				NonIdentityEnabled:         BoolPtr(true),
-			},
 		})
 	}
 }
diff --git a/teams_audit_ssh_settings_test.go b/teams_audit_ssh_settings_test.go
deleted file mode 100644
index 934f98099..000000000
--- a/teams_audit_ssh_settings_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package cloudflare
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-)
-
-func TestGetAuditSSHSettings(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			"result": {
-				"public_key": "1pyl6I1tL7xfJuFYVzXlUW8uXXlpxegHXBzGCBKaSFA=",
-				"seed_id": "f1f968a9-83e7-401a-8abc-e0efe128425c",
-				"created_at": "2014-01-01T05:20:00.12345Z",
-				"updated_at": "2014-01-01T05:20:00.12345Z"
-			}
-		}
-		`)
-	}
-
-	createdAt, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-	updatedAt, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-
-	want := AuditSSHSettings{
-		PublicKey: "1pyl6I1tL7xfJuFYVzXlUW8uXXlpxegHXBzGCBKaSFA=",
-		SeedUUID:  "f1f968a9-83e7-401a-8abc-e0efe128425c",
-		CreatedAt: &createdAt,
-		UpdatedAt: &updatedAt,
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/gateway/audit_ssh_settings", handler)
-
-	actual, _, err := client.GetAuditSSHSettings(context.Background(), AccountIdentifier(testAccountID), GetAuditSSHSettingsParams{})
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, want, actual)
-	}
-}
-
-func TestUpdateAuditSSHSettings(t *testing.T) {
-	setup()
-	defer teardown()
-
-	handler := func(w http.ResponseWriter, r *http.Request) {
-		assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method)
-		w.Header().Set("content-type", "application/json")
-		fmt.Fprintf(w, `{
-			"success": true,
-			"errors": [],
-			"messages": [],
-			"result": {
-				"public_key": "updated1tL7xfJuFYVzXlUW8uXXlpxegHXBzGCBKaSFA=",
-				"seed_id": "f1f968a9-83e7-401a-8abc-e0efe128425c",
-				"created_at": "2014-01-01T05:20:00.12345Z",
-				"updated_at": "2014-01-01T05:20:00.12345Z"
-			}
-		}
-		`)
-	}
-
-	createdAt, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-	updatedAt, _ := time.Parse(time.RFC3339, "2014-01-01T05:20:00.12345Z")
-
-	want := AuditSSHSettings{
-		PublicKey: "updated1tL7xfJuFYVzXlUW8uXXlpxegHXBzGCBKaSFA=",
-		SeedUUID:  "f1f968a9-83e7-401a-8abc-e0efe128425c",
-		CreatedAt: &createdAt,
-		UpdatedAt: &updatedAt,
-	}
-
-	mux.HandleFunc("/accounts/"+testAccountID+"/gateway/audit_ssh_settings", handler)
-
-	actual, err := client.UpdateAuditSSHSettings(context.Background(), AccountIdentifier(testAccountID), UpdateAuditSSHSettingsParams{PublicKey: "updated1tL7xfJuFYVzXlUW8uXXlpxegHXBzGCBKaSFA="})
-
-	if assert.NoError(t, err) {
-		assert.Equal(t, want, actual)
-	}
-}
diff --git a/teams_rules_test.go b/teams_rules_test.go
index 0378d5bcf..5fe9ac6c5 100644
--- a/teams_rules_test.go
+++ b/teams_rules_test.go
@@ -53,6 +53,19 @@ func TestTeamsRules(t *testing.T) {
                     "insecure_disable_dnssec_validation": false,
 					"untrusted_cert": {
 						"action": "error"
+					},
+					"dns_resolvers": {
+						"ipv4": [
+							{"ip": "10.0.0.2", "port": 5053},
+							{
+								"ip": "192.168.0.2",
+								"vnet_id": "16fd7a32-11f0-4687-a0bb-7031d241e184",
+								"route_through_private_network": true
+							}
+						],
+						"ipv6": [
+							{"ip": "2460::1"}
+						]
 					}
 				  }
 				},
@@ -84,7 +97,8 @@ func TestTeamsRules(t *testing.T) {
                     "insecure_disable_dnssec_validation": true,
 					"untrusted_cert": {
 						"action": "pass_through"
-					}
+					},
+					"resolve_dns_through_cloudflare": true
 				  }
 				}
 			]
@@ -123,6 +137,30 @@ func TestTeamsRules(t *testing.T) {
 			UntrustedCertSettings: &UntrustedCertSettings{
 				Action: UntrustedCertError,
 			},
+			DnsResolverSettings: &TeamsDnsResolverSettings{
+				V4Resolvers: []TeamsDnsResolverAddressV4{
+					{
+						TeamsDnsResolverAddress{
+							IP:   "10.0.0.2",
+							Port: IntPtr(5053),
+						},
+					},
+					{
+						TeamsDnsResolverAddress{
+							IP:                         "192.168.0.2",
+							VnetID:                     "16fd7a32-11f0-4687-a0bb-7031d241e184",
+							RouteThroughPrivateNetwork: BoolPtr(true),
+						},
+					},
+				},
+				V6Resolvers: []TeamsDnsResolverAddressV6{
+					{
+						TeamsDnsResolverAddress{
+							IP: "2460::1",
+						},
+					},
+				},
+			},
 		},
 		CreatedAt: &createdAt,
 		UpdatedAt: &updatedAt,
@@ -154,6 +192,7 @@ func TestTeamsRules(t *testing.T) {
 				UntrustedCertSettings: &UntrustedCertSettings{
 					Action: UntrustedCertPassthrough,
 				},
+				ResolveDnsThroughCloudflare: BoolPtr(true),
 			},
 			CreatedAt: &createdAt,
 			UpdatedAt: &updatedAt,