diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index 24943e1161..287adf7668 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -13,5 +13,5 @@
 # limitations under the License.
 docker:
   image: gcr.io/cloud-devrel-public-resources/owlbot-nodejs:latest
-  digest: sha256:609822e3c09b7a1bd90b99655904609f162cc15acb4704f1edf778284c36f429
-# created: 2024-10-01T19:34:30.797530443Z
+  digest: sha256:2d9cc5ba06665c588e4d6accba03321d1314358ebb68dd0a7515ff28ada937ff
+# created: 2024-10-04T17:39:56.481250506Z
diff --git a/.kokoro/common.cfg b/.kokoro/common.cfg
index f64ba6b527..ad59b176ad 100644
--- a/.kokoro/common.cfg
+++ b/.kokoro/common.cfg
@@ -16,7 +16,7 @@ build_file: "google-api-nodejs-client/.kokoro/trampoline_v2.sh"
 # Configure the docker image for kokoro-trampoline.
 env_vars: {
     key: "TRAMPOLINE_IMAGE"
-    value: "gcr.io/cloud-devrel-kokoro-resources/node:14-user"
+    value: "gcr.io/cloud-devrel-kokoro-resources/node:18-user"
 }
 env_vars: {
     key: "TRAMPOLINE_BUILD_FILE"
diff --git a/.kokoro/continuous/node18/common.cfg b/.kokoro/continuous/node18/common.cfg
new file mode 100644
index 0000000000..ad59b176ad
--- /dev/null
+++ b/.kokoro/continuous/node18/common.cfg
@@ -0,0 +1,24 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+  define_artifacts {
+    regex: "**/*sponge_log.xml"
+  }
+}
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "google-api-nodejs-client/.kokoro/trampoline_v2.sh"
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+    key: "TRAMPOLINE_IMAGE"
+    value: "gcr.io/cloud-devrel-kokoro-resources/node:18-user"
+}
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/google-api-nodejs-client/.kokoro/test.sh"
+}
diff --git a/.kokoro/continuous/node18/lint.cfg b/.kokoro/continuous/node18/lint.cfg
new file mode 100644
index 0000000000..baf4ba48f1
--- /dev/null
+++ b/.kokoro/continuous/node18/lint.cfg
@@ -0,0 +1,4 @@
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/google-api-nodejs-client/.kokoro/lint.sh"
+}
diff --git a/.kokoro/continuous/node18/samples-test.cfg b/.kokoro/continuous/node18/samples-test.cfg
new file mode 100644
index 0000000000..cdae7fe2a0
--- /dev/null
+++ b/.kokoro/continuous/node18/samples-test.cfg
@@ -0,0 +1,12 @@
+# Download resources for system tests (service account key, etc.)
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/google-cloud-nodejs"
+
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/google-api-nodejs-client/.kokoro/samples-test.sh"
+}
+
+env_vars: {
+  key: "SECRET_MANAGER_KEYS"
+  value: "long-door-651-kokoro-system-test-service-account"
+}
\ No newline at end of file
diff --git a/.kokoro/continuous/node18/system-test.cfg b/.kokoro/continuous/node18/system-test.cfg
new file mode 100644
index 0000000000..a7eef3cb5f
--- /dev/null
+++ b/.kokoro/continuous/node18/system-test.cfg
@@ -0,0 +1,12 @@
+# Download resources for system tests (service account key, etc.)
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/google-cloud-nodejs"
+
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/google-api-nodejs-client/.kokoro/system-test.sh"
+}
+
+env_vars: {
+  key: "SECRET_MANAGER_KEYS"
+  value: "long-door-651-kokoro-system-test-service-account"
+}
\ No newline at end of file
diff --git a/.kokoro/continuous/node18/test.cfg b/.kokoro/continuous/node18/test.cfg
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/.kokoro/presubmit/node18/common.cfg b/.kokoro/presubmit/node18/common.cfg
new file mode 100644
index 0000000000..ad59b176ad
--- /dev/null
+++ b/.kokoro/presubmit/node18/common.cfg
@@ -0,0 +1,24 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+  define_artifacts {
+    regex: "**/*sponge_log.xml"
+  }
+}
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "google-api-nodejs-client/.kokoro/trampoline_v2.sh"
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+    key: "TRAMPOLINE_IMAGE"
+    value: "gcr.io/cloud-devrel-kokoro-resources/node:18-user"
+}
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/google-api-nodejs-client/.kokoro/test.sh"
+}
diff --git a/.kokoro/presubmit/node18/samples-test.cfg b/.kokoro/presubmit/node18/samples-test.cfg
new file mode 100644
index 0000000000..cdae7fe2a0
--- /dev/null
+++ b/.kokoro/presubmit/node18/samples-test.cfg
@@ -0,0 +1,12 @@
+# Download resources for system tests (service account key, etc.)
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/google-cloud-nodejs"
+
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/google-api-nodejs-client/.kokoro/samples-test.sh"
+}
+
+env_vars: {
+  key: "SECRET_MANAGER_KEYS"
+  value: "long-door-651-kokoro-system-test-service-account"
+}
\ No newline at end of file
diff --git a/.kokoro/presubmit/node18/system-test.cfg b/.kokoro/presubmit/node18/system-test.cfg
new file mode 100644
index 0000000000..a7eef3cb5f
--- /dev/null
+++ b/.kokoro/presubmit/node18/system-test.cfg
@@ -0,0 +1,12 @@
+# Download resources for system tests (service account key, etc.)
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/google-cloud-nodejs"
+
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/google-api-nodejs-client/.kokoro/system-test.sh"
+}
+
+env_vars: {
+  key: "SECRET_MANAGER_KEYS"
+  value: "long-door-651-kokoro-system-test-service-account"
+}
\ No newline at end of file
diff --git a/.kokoro/presubmit/node18/test.cfg b/.kokoro/presubmit/node18/test.cfg
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/.kokoro/release/docs-devsite.cfg b/.kokoro/release/docs-devsite.cfg
index bea57d1592..aadc7f0aa9 100644
--- a/.kokoro/release/docs-devsite.cfg
+++ b/.kokoro/release/docs-devsite.cfg
@@ -11,7 +11,7 @@ before_action {
 # doc publications use a Python image.
 env_vars: {
     key: "TRAMPOLINE_IMAGE"
-    value: "gcr.io/cloud-devrel-kokoro-resources/node:14-user"
+    value: "gcr.io/cloud-devrel-kokoro-resources/node:18-user"
 }
 
 # Download trampoline resources.
diff --git a/.kokoro/release/docs.cfg b/.kokoro/release/docs.cfg
index 5e8f28e2c1..65c1c199fa 100644
--- a/.kokoro/release/docs.cfg
+++ b/.kokoro/release/docs.cfg
@@ -11,7 +11,7 @@ before_action {
 # doc publications use a Python image.
 env_vars: {
     key: "TRAMPOLINE_IMAGE"
-    value: "gcr.io/cloud-devrel-kokoro-resources/node:14-user"
+    value: "gcr.io/cloud-devrel-kokoro-resources/node:18-user"
 }
 
 # Download trampoline resources.
diff --git a/.kokoro/release/docs.sh b/.kokoro/release/docs.sh
index 1d8f3f490a..e9079a6053 100755
--- a/.kokoro/release/docs.sh
+++ b/.kokoro/release/docs.sh
@@ -16,7 +16,7 @@
 
 set -eo pipefail
 
-# build jsdocs (Python is installed on the Node 10 docker image).
+# build jsdocs (Python is installed on the Node 18 docker image).
 if [[ -z "$CREDENTIALS" ]]; then
   # if CREDENTIALS are explicitly set, assume we're testing locally
   # and don't set NPM_CONFIG_PREFIX.
diff --git a/.kokoro/samples-test.sh b/.kokoro/samples-test.sh
index 8c5d108cb5..c1cb0fc770 100755
--- a/.kokoro/samples-test.sh
+++ b/.kokoro/samples-test.sh
@@ -56,7 +56,7 @@ fi
 
 # codecov combines coverage across integration and unit tests. Include
 # the logic below for any environment you wish to collect coverage for:
-COVERAGE_NODE=14
+COVERAGE_NODE=18
 if npx check-node-version@3.3.0 --silent --node $COVERAGE_NODE; then
   NYC_BIN=./node_modules/nyc/bin/nyc.js
   if [ -f "$NYC_BIN" ]; then
diff --git a/.kokoro/system-test.sh b/.kokoro/system-test.sh
index 0b3043d268..a90d5cfec8 100755
--- a/.kokoro/system-test.sh
+++ b/.kokoro/system-test.sh
@@ -49,7 +49,7 @@ npm run system-test
 
 # codecov combines coverage across integration and unit tests. Include
 # the logic below for any environment you wish to collect coverage for:
-COVERAGE_NODE=14
+COVERAGE_NODE=18
 if npx check-node-version@3.3.0 --silent --node $COVERAGE_NODE; then
   NYC_BIN=./node_modules/nyc/bin/nyc.js
   if [ -f "$NYC_BIN" ]; then
diff --git a/.kokoro/test.bat b/.kokoro/test.bat
index 0bb1240523..caf825656c 100644
--- a/.kokoro/test.bat
+++ b/.kokoro/test.bat
@@ -21,7 +21,7 @@ cd ..
 @rem we upgrade Node.js in the image:
 SET PATH=%PATH%;/cygdrive/c/Program Files/nodejs/npm
 
-call nvm use v14.17.3
+call nvm use 18
 call which node
 
 call npm install || goto :error
diff --git a/.kokoro/test.sh b/.kokoro/test.sh
index 862d478d32..0d9f6392a7 100755
--- a/.kokoro/test.sh
+++ b/.kokoro/test.sh
@@ -39,7 +39,7 @@ npm test
 
 # codecov combines coverage across integration and unit tests. Include
 # the logic below for any environment you wish to collect coverage for:
-COVERAGE_NODE=14
+COVERAGE_NODE=18
 if npx check-node-version@3.3.0 --silent --node $COVERAGE_NODE; then
   NYC_BIN=./node_modules/nyc/bin/nyc.js
   if [ -f "$NYC_BIN" ]; then
diff --git a/.kokoro/trampoline_v2.sh b/.kokoro/trampoline_v2.sh
index 4d03112128..5d6cfcca52 100755
--- a/.kokoro/trampoline_v2.sh
+++ b/.kokoro/trampoline_v2.sh
@@ -44,7 +44,7 @@
 # the project root.
 #
 # Here is an example for running this script.
-#   TRAMPOLINE_IMAGE=gcr.io/cloud-devrel-kokoro-resources/node:10-user \
+#   TRAMPOLINE_IMAGE=gcr.io/cloud-devrel-kokoro-resources/node:18-user \
 #     TRAMPOLINE_BUILD_FILE=.kokoro/system-test.sh \
 #     .kokoro/trampoline_v2.sh