diff --git a/Cargo.lock b/Cargo.lock
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5406,6 +5406,8 @@
  "lapin",
  "once_cell",
  "prost",
+ "reqwest",
+ "serde",
  "serde_json",
  "tokio",
  "tonic 0.8.3",
diff --git a/services/tunnelbroker/Cargo.toml b/services/tunnelbroker/Cargo.toml
--- a/services/tunnelbroker/Cargo.toml
+++ b/services/tunnelbroker/Cargo.toml
@@ -31,6 +31,8 @@
 chrono = { workspace = true }
 uuid = { workspace = true, features = ["v4"] }
 jsonwebtoken = "9.3.0"
+reqwest = { workspace = true, features = ["json", "native-tls", "rustls-tls"] }
+serde.workspace = true
 
 [build-dependencies]
 tonic-build = "0.8"
diff --git a/services/tunnelbroker/src/main.rs b/services/tunnelbroker/src/main.rs
--- a/services/tunnelbroker/src/main.rs
+++ b/services/tunnelbroker/src/main.rs
@@ -5,6 +5,7 @@
 pub mod error;
 pub mod grpc;
 pub mod identity;
+pub mod notifs;
 pub mod websockets;
 
 use anyhow::{anyhow, Result};
diff --git a/services/tunnelbroker/src/notifs/apns/mod.rs b/services/tunnelbroker/src/notifs/apns/mod.rs
new file mode 100644
--- /dev/null
+++ b/services/tunnelbroker/src/notifs/apns/mod.rs
@@ -0,0 +1,5 @@
+#[derive(Clone)]
+pub struct APNsClient {
+  http2_client: reqwest::Client,
+  is_prod: bool,
+}
diff --git a/services/tunnelbroker/src/notifs/mod.rs b/services/tunnelbroker/src/notifs/mod.rs
new file mode 100644
--- /dev/null
+++ b/services/tunnelbroker/src/notifs/mod.rs
@@ -0,0 +1,8 @@
+use crate::notifs::apns::APNsClient;
+
+pub mod apns;
+
+#[derive(Clone)]
+pub struct NotifClient {
+  pub(crate) apns: Option<APNsClient>,
+}