Repository: sugyan/atrium (language: rust)

Issue:
Labels and moderation functions for AtpAgent
The official TypeScript SDK provides methods to help developers interact with labels and moderation.
We would like to provide equivalent functionality in ATrium.

- https://docs.bsky.app/docs/advanced-guides/moderation#official-sdk
- https://github.com/bluesky-social/atproto/pull/2286/files#diff-3273322cf2f11a8b70880ad5206641552036c51fceaf2373cfcdbf0a3d17d787


Discussion / hints:

Fix patch:
diff --git a/atrium-api/src/agent.rs b/atrium-api/src/agent.rs
index 99e403f2..9abfd0f1 100644
--- a/atrium-api/src/agent.rs
+++ b/atrium-api/src/agent.rs
@@ -1,9 +1,12 @@
 //! Implementation of [`AtpAgent`] and definitions of [`SessionStore`] for it.
+#[cfg(feature = "bluesky")]
+pub mod bluesky;
 mod inner;
 pub mod store;
 
 use self::store::SessionStore;
 use crate::client::Service;
+use crate::types::string::Did;
 use atrium_xrpc::error::Error;
 use atrium_xrpc::XrpcClient;
 use std::sync::Arc;
@@ -11,6 +14,24 @@ use std::sync::Arc;
 /// Type alias for the [com::atproto::server::create_session::Output](crate::com::atproto::server::create_session::Output)
 pub type Session = crate::com::atproto::server::create_session::Output;
 
+/// Supported proxy targets.
+#[cfg(feature = "bluesky")]
+pub type AtprotoServiceType = self::bluesky::AtprotoServiceType;
+
+#[cfg(not(feature = "bluesky"))]
+pub enum AtprotoServiceType {
+    AtprotoLabeler,
+}
+
+#[cfg(not(feature = "bluesky"))]
+impl AsRef<str> for AtprotoServiceType {
+    fn as_ref(&self) -> &str {
+        match self {
+            Self::AtprotoLabeler => "atproto_labeler",
+        }
+    }
+}
+
 /// An ATP "Agent".
 /// Manages session token lifecycles and provides convenience methods.
 pub struct AtpAgent<S, T>
@@ -19,6 +40,7 @@ where
     T: XrpcClient + Send + Sync,
 {
     store: Arc<inner::Store<S>>,
+    inner: Arc<inner::Client<S, T>>,
     pub api: Service<inner::Client<S, T>>,
 }
 
@@ -30,8 +52,9 @@ where
     /// Create a new agent.
     pub fn new(xrpc: T, store: S) -> Self {
         let store = Arc::new(inner::Store::new(store, xrpc.base_uri()));
-        let api = Service::new(Arc::new(inner::Client::new(Arc::clone(&store), xrpc)));
-        Self { store, api }
+        let inner = Arc::new(inner::Client::new(Arc::clone(&store), xrpc));
+        let api = Service::new(Arc::clone(&inner));
+        Self { store, inner, api }
     }
     /// Start a new session with this agent.
     pub async fn login(
@@ -84,6 +107,24 @@ where
             }
         }
     }
+    /// Configures the moderation services to be applied on requests.
+    pub fn configure_labelers_header(&self, labeler_dids: Option<Vec<Did>>) {
+        self.inner.configure_labelers_header(labeler_dids);
+    }
+    /// Configures the atproto-proxy header to be applied on requests.
+    pub fn configure_proxy_header(&self, did: Did, service_type: impl AsRef<str>) {
+        self.inner.configure_proxy_header(did, service_type);
+    }
+    /// Configures the atproto-proxy header to be applied on requests.
+    ///
+    /// Returns a new client service with the proxy header configured.
+    pub fn api_with_proxy(
+        &self,
+        did: Did,
+        service_type: impl AsRef<str>,
+    ) -> Service<inner::Client<S, T>> {
+        Service::new(Arc::new(self.inner.clone_with_proxy(did, service_type)))
+    }
 }
 
 #[cfg(test)]
@@ -93,27 +134,28 @@ mod tests {
     use crate::did_doc::{DidDocument, Service, VerificationMethod};
     use async_trait::async_trait;
     use atrium_xrpc::HttpClient;
-    use http::{Request, Response};
+    use http::{HeaderMap, HeaderName, HeaderValue, Request, Response};
     use std::collections::HashMap;
     use tokio::sync::RwLock;
     #[cfg(target_arch = "wasm32")]
     use wasm_bindgen_test::wasm_bindgen_test;
 
     #[derive(Default)]
-    struct DummyResponses {
+    struct MockResponses {
         create_session: Option<crate::com::atproto::server::create_session::Output>,
         get_session: Option<crate::com::atproto::server::get_session::Output>,
     }
 
     #[derive(Default)]
-    struct DummyClient {
-        responses: DummyResponses,
+    struct MockClient {
+        responses: MockResponses,
         counts: Arc<RwLock<HashMap<String, usize>>>,
+        headers: Arc<RwLock<Vec<HeaderMap<HeaderValue>>>>,
     }
 
     #[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
     #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
-    impl HttpClient for DummyClient {
+    impl HttpClient for MockClient {
         async fn send_http(
             &self,
             request: Request<Vec<u8>>,
@@ -121,6 +163,7 @@ mod tests {
             #[cfg(not(target_arch = "wasm32"))]
             tokio::time::sleep(std::time::Duration::from_micros(10)).await;
 
+            self.headers.write().await.push(request.headers().clone());
             let builder =
                 Response::builder().header(http::header::CONTENT_TYPE, "application/json");
             let token = request
@@ -140,19 +183,19 @@ mod tests {
             if let Some(nsid) = request.uri().path().strip_prefix("/xrpc/") {
                 *self.counts.write().await.entry(nsid.into()).or_default() += 1;
                 match nsid {
-                    "com.atproto.server.createSession" => {
+                    crate::com::atproto::server::create_session::NSID => {
                         if let Some(output) = &self.responses.create_session {
                             body.extend(serde_json::to_vec(output)?);
                         }
                     }
-                    "com.atproto.server.getSession" => {
+                    crate::com::atproto::server::get_session::NSID => {
                         if token == Some("access") {
                             if let Some(output) = &self.responses.get_session {
                                 body.extend(serde_json::to_vec(output)?);
                             }
                         }
                     }
-                    "com.atproto.server.refreshSession" => {
+                    crate::com::atproto::server::refresh_session::NSID => {
                         if token == Some("refresh") {
                             body.extend(serde_json::to_vec(
                                 &crate::com::atproto::server::refresh_session::Output {
@@ -165,6 +208,18 @@ mod tests {
                             )?);
                         }
                     }
+                    crate::com::atproto::server::describe_server::NSID => {
+                        body.extend(serde_json::to_vec(
+                            &crate::com::atproto::server::describe_server::Output {
+                                available_user_domains: Vec::new(),
+                                contact: None,
+                                did: "did:web:example.com".parse().expect("valid"),
+                                invite_code_required: None,
+                                links: None,
+                                phone_verification_required: None,
+                            },
+                        )?);
+                    }
                     _ => {}
                 }
             }
@@ -183,7 +238,7 @@ mod tests {
         }
     }
 
-    impl XrpcClient for DummyClient {
+    impl XrpcClient for MockClient {
         fn base_uri(&self) -> String {
             "http://localhost:8080".into()
         }
@@ -205,7 +260,7 @@ mod tests {
     #[tokio::test]
     #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
     async fn test_new() {
-        let agent = AtpAgent::new(DummyClient::default(), MemorySessionStore::default());
+        let agent = AtpAgent::new(MockClient::default(), MemorySessionStore::default());
         assert_eq!(agent.store.get_session().await, None);
     }
 
@@ -215,8 +270,8 @@ mod tests {
         let session = session();
         // success
         {
-            let client = DummyClient {
-                responses: DummyResponses {
+            let client = MockClient {
+                responses: MockResponses {
                     create_session: Some(crate::com::atproto::server::create_session::Output {
                         ..session.clone()
                     }),
@@ -233,8 +288,8 @@ mod tests {
         }
         // failure with `createSession` error
         {
-            let client = DummyClient {
-                responses: DummyResponses {
+            let client = MockClient {
+                responses: MockResponses {
                     ..Default::default()
                 },
                 ..Default::default()
@@ -252,8 +307,8 @@ mod tests {
     #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
     async fn test_xrpc_get_session() {
         let session = session();
-        let client = DummyClient {
-            responses: DummyResponses {
+        let client = MockClient {
+            responses: MockResponses {
                 get_session: Some(crate::com::atproto::server::get_session::Output {
                     did: session.did.clone(),
                     did_doc: session.did_doc.clone(),
@@ -284,8 +339,8 @@ mod tests {
     async fn test_xrpc_get_session_with_refresh() {
         let mut session = session();
         session.access_jwt = String::from("expired");
-        let client = DummyClient {
-            responses: DummyResponses {
+        let client = MockClient {
+            responses: MockResponses {
                 get_session: Some(crate::com::atproto::server::get_session::Output {
                     did: session.did.clone(),
                     did_doc: session.did_doc.clone(),
@@ -324,8 +379,8 @@ mod tests {
     async fn test_xrpc_get_session_with_duplicated_refresh() {
         let mut session = session();
         session.access_jwt = String::from("expired");
-        let client = DummyClient {
-            responses: DummyResponses {
+        let client = MockClient {
+            responses: MockResponses {
                 get_session: Some(crate::com::atproto::server::get_session::Output {
                     did: session.did.clone(),
                     did_doc: session.did_doc.clone(),
@@ -377,8 +432,8 @@ mod tests {
         let session = session();
         // success
         {
-            let client = DummyClient {
-                responses: DummyResponses {
+            let client = MockClient {
+                responses: MockResponses {
                     get_session: Some(crate::com::atproto::server::get_session::Output {
                         did: session.did.clone(),
                         did_doc: session.did_doc.clone(),
@@ -404,8 +459,8 @@ mod tests {
         }
         // failure with `getSession` error
         {
-            let client = DummyClient {
-                responses: DummyResponses {
+            let client = MockClient {
+                responses: MockResponses {
                     ..Default::default()
                 },
                 ..Default::default()
@@ -424,8 +479,8 @@ mod tests {
     #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
     async fn test_resume_session_with_refresh() {
         let session = session();
-        let client = DummyClient {
-            responses: DummyResponses {
+        let client = MockClient {
+            responses: MockResponses {
                 get_session: Some(crate::com::atproto::server::get_session::Output {
                     did: session.did.clone(),
                     did_doc: session.did_doc.clone(),
@@ -472,8 +527,8 @@ mod tests {
         };
         // success
         {
-            let client = DummyClient {
-                responses: DummyResponses {
+            let client = MockClient {
+                responses: MockResponses {
                     create_session: Some(crate::com::atproto::server::create_session::Output {
                         did_doc: Some(did_doc.clone()),
                         ..session.clone()
@@ -495,8 +550,8 @@ mod tests {
         }
         // invalid services
         {
-            let client = DummyClient {
-                responses: DummyResponses {
+            let client = MockClient {
+                responses: MockResponses {
                     create_session: Some(crate::com::atproto::server::create_session::Output {
                         did_doc: Some(DidDocument {
                             service: Some(vec![
@@ -532,4 +587,154 @@ mod tests {
             );
         }
     }
+
+    #[tokio::test]
+    #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
+    async fn test_configure_labelers_header() {
+        let client = MockClient::default();
+        let headers = Arc::clone(&client.headers);
+        let agent = AtpAgent::new(client, MemorySessionStore::default());
+
+        agent
+            .api
+            .com
+            .atproto
+            .server
+            .describe_server()
+            .await
+            .expect("describe_server should be succeeded");
+        assert_eq!(headers.read().await.last(), Some(&HeaderMap::new()));
+
+        agent.configure_labelers_header(Some(vec!["did:plc:test1"
+            .parse()
+            .expect("did should be valid")]));
+        agent
+            .api
+            .com
+            .atproto
+            .server
+            .describe_server()
+            .await
+            .expect("describe_server should be succeeded");
+        assert_eq!(
+            headers.read().await.last(),
+            Some(&HeaderMap::from_iter([(
+                HeaderName::from_static("atproto-accept-labelers"),
+                HeaderValue::from_static("did:plc:test1"),
+            )]))
+        );
+
+        agent.configure_labelers_header(Some(vec![
+            "did:plc:test1".parse().expect("did should be valid"),
+            "did:plc:test2".parse().expect("did should be valid"),
+        ]));
+        agent
+            .api
+            .com
+            .atproto
+            .server
+            .describe_server()
+            .await
+            .expect("describe_server should be succeeded");
+        assert_eq!(
+            headers.read().await.last(),
+            Some(&HeaderMap::from_iter([(
+                HeaderName::from_static("atproto-accept-labelers"),
+                HeaderValue::from_static("did:plc:test1, did:plc:test2"),
+            )]))
+        );
+    }
+
+    #[tokio::test]
+    #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
+    async fn test_configure_proxy_header() {
+        let client = MockClient::default();
+        let headers = Arc::clone(&client.headers);
+        let agent = AtpAgent::new(client, MemorySessionStore::default());
+
+        agent
+            .api
+            .com
+            .atproto
+            .server
+            .describe_server()
+            .await
+            .expect("describe_server should be succeeded");
+        assert_eq!(headers.read().await.last(), Some(&HeaderMap::new()));
+
+        agent.configure_proxy_header(
+            "did:plc:test1".parse().expect("did should be balid"),
+            AtprotoServiceType::AtprotoLabeler,
+        );
+        agent
+            .api
+            .com
+            .atproto
+            .server
+            .describe_server()
+            .await
+            .expect("describe_server should be succeeded");
+        assert_eq!(
+            headers.read().await.last(),
+            Some(&HeaderMap::from_iter([(
+                HeaderName::from_static("atproto-proxy"),
+                HeaderValue::from_static("did:plc:test1#atproto_labeler"),
+            ),]))
+        );
+
+        agent.configure_proxy_header(
+            "did:plc:test1".parse().expect("did should be balid"),
+            "atproto_labeler",
+        );
+        agent
+            .api
+            .com
+            .atproto
+            .server
+            .describe_server()
+            .await
+            .expect("describe_server should be succeeded");
+        assert_eq!(
+            headers.read().await.last(),
+            Some(&HeaderMap::from_iter([(
+                HeaderName::from_static("atproto-proxy"),
+                HeaderValue::from_static("did:plc:test1#atproto_labeler"),
+            ),]))
+        );
+
+        agent
+            .api_with_proxy(
+                "did:plc:test2".parse().expect("did should be balid"),
+                "atproto_labeler",
+            )
+            .com
+            .atproto
+            .server
+            .describe_server()
+            .await
+            .expect("describe_server should be succeeded");
+        assert_eq!(
+            headers.read().await.last(),
+            Some(&HeaderMap::from_iter([(
+                HeaderName::from_static("atproto-proxy"),
+                HeaderValue::from_static("did:plc:test2#atproto_labeler"),
+            ),]))
+        );
+
+        agent
+            .api
+            .com
+            .atproto
+            .server
+            .describe_server()
+            .await
+            .expect("describe_server should be succeeded");
+        assert_eq!(
+            headers.read().await.last(),
+            Some(&HeaderMap::from_iter([(
+                HeaderName::from_static("atproto-proxy"),
+                HeaderValue::from_static("did:plc:test1#atproto_labeler"),
+            ),]))
+        );
+    }
 }
diff --git a/atrium-api/src/agent/bluesky.rs b/atrium-api/src/agent/bluesky.rs
new file mode 100644
index 00000000..cce4dc18
--- /dev/null
+++ b/atrium-api/src/agent/bluesky.rs
@@ -0,0 +1,19 @@
+//! Bluesky specific constants.
+
+/// DID of the bluesky labeler service.
+pub const CHAT_BSKY_DID: &str = "did:web:api.bsky.chat";
+
+/// Supported proxy targets, which includes the bluesky specific services.
+pub enum AtprotoServiceType {
+    AtprotoLabeler,
+    BskyChat,
+}
+
+impl AsRef<str> for AtprotoServiceType {
+    fn as_ref(&self) -> &str {
+        match self {
+            Self::AtprotoLabeler => "atproto_labeler",
+            Self::BskyChat => "bsky_chat",
+        }
+    }
+}
diff --git a/atrium-api/src/agent/inner.rs b/atrium-api/src/agent/inner.rs
index 37938abc..8bbccdb9 100644
--- a/atrium-api/src/agent/inner.rs
+++ b/atrium-api/src/agent/inner.rs
@@ -1,5 +1,6 @@
 use super::{Session, SessionStore};
 use crate::did_doc::DidDocument;
+use crate::types::string::Did;
 use async_trait::async_trait;
 use atrium_xrpc::error::{Error, Result, XrpcErrorKind};
 use atrium_xrpc::{HttpClient, OutputDataOrBytes, XrpcClient, XrpcRequest};
@@ -8,16 +9,48 @@ use serde::{de::DeserializeOwned, Serialize};
 use std::sync::{Arc, RwLock};
 use tokio::sync::{Mutex, Notify};
 
-const REFRESH_SESSION: &str = "com.atproto.server.refreshSession";
-
-struct SessionStoreClient<S, T> {
+struct WrapperClient<S, T> {
     store: Arc<Store<S>>,
-    inner: T,
+    proxy_header: RwLock<Option<String>>,
+    labelers_header: Arc<RwLock<Option<Vec<String>>>>,
+    inner: Arc<T>,
+}
+
+impl<S, T> WrapperClient<S, T> {
+    fn configure_proxy_header(&self, value: String) {
+        self.proxy_header
+            .write()
+            .expect("failed to write proxy header")
+            .replace(value);
+    }
+    fn configure_labelers_header(&self, labelers_dids: Option<Vec<Did>>) {
+        *self
+            .labelers_header
+            .write()
+            .expect("failed to write labelers header") =
+            labelers_dids.map(|dids| dids.iter().map(|did| did.as_ref().into()).collect())
+    }
+}
+
+impl<S, T> Clone for WrapperClient<S, T> {
+    fn clone(&self) -> Self {
+        Self {
+            store: self.store.clone(),
+            labelers_header: self.labelers_header.clone(),
+            proxy_header: RwLock::new(
+                self.proxy_header
+                    .read()
+                    .expect("failed to read proxy header")
+                    .clone(),
+            ),
+            inner: self.inner.clone(),
+        }
+    }
 }
 
 #[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
 #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
-impl<S, T> HttpClient for SessionStoreClient<S, T>
+impl<S, T> HttpClient for WrapperClient<S, T>
 where
     S: Send + Sync,
     T: HttpClient + Send + Sync,
@@ -33,7 +66,7 @@ where
 
 #[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
 #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
-impl<S, T> XrpcClient for SessionStoreClient<S, T>
+impl<S, T> XrpcClient for WrapperClient<S, T>
 where
     S: SessionStore + Send + Sync,
     T: XrpcClient + Send + Sync,
@@ -41,7 +74,7 @@ where
     fn base_uri(&self) -> String {
         self.store.get_endpoint()
     }
-    async fn auth(&self, is_refresh: bool) -> Option<String> {
+    async fn authentication_token(&self, is_refresh: bool) -> Option<String> {
         self.store.get_session().await.map(|session| {
             if is_refresh {
                 session.refresh_jwt
@@ -50,13 +83,25 @@ where
             }
         })
     }
+    async fn atproto_proxy_header(&self) -> Option<String> {
+        self.proxy_header
+            .read()
+            .expect("failed to read proxy header")
+            .clone()
+    }
+    async fn atproto_accept_labelers_header(&self) -> Option<Vec<String>> {
+        self.labelers_header
+            .read()
+            .expect("failed to read labelers header")
+            .clone()
+    }
 }
 
 pub struct Client<S, T> {
     store: Arc<Store<S>>,
-    inner: SessionStoreClient<S, T>,
-    is_refreshing: Mutex<bool>,
-    notify: Notify,
+    inner: WrapperClient<S, T>,
+    is_refreshing: Arc<Mutex<bool>>,
+    notify: Arc<Notify>,
 }
 
 impl<S, T> Client<S, T>
@@ -65,17 +110,33 @@ where
     T: XrpcClient + Send + Sync,
 {
     pub(crate) fn new(store: Arc<Store<S>>, xrpc: T) -> Self {
-        let inner = SessionStoreClient {
+        let inner = WrapperClient {
             store: Arc::clone(&store),
-            inner: xrpc,
+            labelers_header: Arc::new(RwLock::new(None)),
+            proxy_header: RwLock::new(None),
+            inner: Arc::new(xrpc),
         };
         Self {
             store,
             inner,
-            is_refreshing: Mutex::new(false),
-            notify: Notify::new(),
+            is_refreshing: Arc::new(Mutex::new(false)),
+            notify: Arc::new(Notify::new()),
         }
     }
+    pub(crate) fn configure_proxy_header(&self, did: Did, service_type: impl AsRef<str>) {
+        self.inner
+            .configure_proxy_header(format!("{}#{}", did.as_ref(), service_type.as_ref()));
+    }
+    pub(crate) fn clone_with_proxy(&self, did: Did, service_type: impl AsRef<str>) -> Self {
+        let cloned = self.clone();
+        cloned
+            .inner
+            .configure_proxy_header(format!("{}#{}", did.as_ref(), service_type.as_ref()));
+        cloned
+    }
+    pub(crate) fn configure_labelers_header(&self, labeler_dids: Option<Vec<Did>>) {
+        self.inner.configure_labelers_header(labeler_dids);
+    }
     // Internal helper to refresh sessions
     // - Wraps the actual implementation to ensure only one refresh is attempted at a time.
     async fn refresh_session(&self) {
@@ -120,7 +181,7 @@ where
             .inner
             .send_xrpc::<(), (), _, _>(&XrpcRequest {
                 method: Method::POST,
-                path: REFRESH_SESSION.into(),
+                nsid: crate::com::atproto::server::refresh_session::NSID.into(),
                 parameters: None,
                 input: None,
                 encoding: None,
@@ -147,6 +208,21 @@ where
     }
 }
 
+impl<S, T> Clone for Client<S, T>
+where
+    S: SessionStore + Send + Sync,
+    T: XrpcClient + Send + Sync,
+{
+    fn clone(&self) -> Self {
+        Self {
+            store: self.store.clone(),
+            inner: self.inner.clone(),
+            is_refreshing: self.is_refreshing.clone(),
+            notify: self.notify.clone(),
+        }
+    }
+}
+
 #[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
 #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
 impl<S, T> HttpClient for Client<S, T>
diff --git a/atrium-api/src/app/bsky/actor/get_preferences.rs b/atrium-api/src/app/bsky/actor/get_preferences.rs
index 72aa486d..6d00f5fb 100644
--- a/atrium-api/src/app/bsky/actor/get_preferences.rs
+++ b/atrium-api/src/app/bsky/actor/get_preferences.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.actor.getPreferences` namespace.
+pub const NSID: &str = "app.bsky.actor.getPreferences";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {}
diff --git a/atrium-api/src/app/bsky/actor/get_profile.rs b/atrium-api/src/app/bsky/actor/get_profile.rs
index 41f2dc8b..7f6bb809 100644
--- a/atrium-api/src/app/bsky/actor/get_profile.rs
+++ b/atrium-api/src/app/bsky/actor/get_profile.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.actor.getProfile` namespace.
+pub const NSID: &str = "app.bsky.actor.getProfile";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/actor/get_profiles.rs b/atrium-api/src/app/bsky/actor/get_profiles.rs
index 53ce6341..01db5a12 100644
--- a/atrium-api/src/app/bsky/actor/get_profiles.rs
+++ b/atrium-api/src/app/bsky/actor/get_profiles.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.actor.getProfiles` namespace.
+pub const NSID: &str = "app.bsky.actor.getProfiles";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/actor/get_suggestions.rs b/atrium-api/src/app/bsky/actor/get_suggestions.rs
index fd18049a..ce6c9997 100644
--- a/atrium-api/src/app/bsky/actor/get_suggestions.rs
+++ b/atrium-api/src/app/bsky/actor/get_suggestions.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.actor.getSuggestions` namespace.
+pub const NSID: &str = "app.bsky.actor.getSuggestions";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/actor/put_preferences.rs b/atrium-api/src/app/bsky/actor/put_preferences.rs
index e784f570..69ca8177 100644
--- a/atrium-api/src/app/bsky/actor/put_preferences.rs
+++ b/atrium-api/src/app/bsky/actor/put_preferences.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.actor.putPreferences` namespace.
+pub const NSID: &str = "app.bsky.actor.putPreferences";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/app/bsky/actor/search_actors.rs b/atrium-api/src/app/bsky/actor/search_actors.rs
index 4cc9d3ad..eae2643d 100644
--- a/atrium-api/src/app/bsky/actor/search_actors.rs
+++ b/atrium-api/src/app/bsky/actor/search_actors.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.actor.searchActors` namespace.
+pub const NSID: &str = "app.bsky.actor.searchActors";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/actor/search_actors_typeahead.rs b/atrium-api/src/app/bsky/actor/search_actors_typeahead.rs
index f6c19f3b..78ada613 100644
--- a/atrium-api/src/app/bsky/actor/search_actors_typeahead.rs
+++ b/atrium-api/src/app/bsky/actor/search_actors_typeahead.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.actor.searchActorsTypeahead` namespace.
+pub const NSID: &str = "app.bsky.actor.searchActorsTypeahead";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/describe_feed_generator.rs b/atrium-api/src/app/bsky/feed/describe_feed_generator.rs
index 05d8f9ff..541f2733 100644
--- a/atrium-api/src/app/bsky/feed/describe_feed_generator.rs
+++ b/atrium-api/src/app/bsky/feed/describe_feed_generator.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.describeFeedGenerator` namespace.
+pub const NSID: &str = "app.bsky.feed.describeFeedGenerator";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/app/bsky/feed/get_actor_feeds.rs b/atrium-api/src/app/bsky/feed/get_actor_feeds.rs
index 8a5a0b21..5a76d486 100644
--- a/atrium-api/src/app/bsky/feed/get_actor_feeds.rs
+++ b/atrium-api/src/app/bsky/feed/get_actor_feeds.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getActorFeeds` namespace.
+pub const NSID: &str = "app.bsky.feed.getActorFeeds";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_actor_likes.rs b/atrium-api/src/app/bsky/feed/get_actor_likes.rs
index 9fca6f0e..2d8762fa 100644
--- a/atrium-api/src/app/bsky/feed/get_actor_likes.rs
+++ b/atrium-api/src/app/bsky/feed/get_actor_likes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getActorLikes` namespace.
+pub const NSID: &str = "app.bsky.feed.getActorLikes";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_author_feed.rs b/atrium-api/src/app/bsky/feed/get_author_feed.rs
index bf801507..2c478850 100644
--- a/atrium-api/src/app/bsky/feed/get_author_feed.rs
+++ b/atrium-api/src/app/bsky/feed/get_author_feed.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getAuthorFeed` namespace.
+pub const NSID: &str = "app.bsky.feed.getAuthorFeed";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_feed.rs b/atrium-api/src/app/bsky/feed/get_feed.rs
index f8ec3ba6..54629da6 100644
--- a/atrium-api/src/app/bsky/feed/get_feed.rs
+++ b/atrium-api/src/app/bsky/feed/get_feed.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getFeed` namespace.
+pub const NSID: &str = "app.bsky.feed.getFeed";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_feed_generator.rs b/atrium-api/src/app/bsky/feed/get_feed_generator.rs
index 78b43b43..5e261e4f 100644
--- a/atrium-api/src/app/bsky/feed/get_feed_generator.rs
+++ b/atrium-api/src/app/bsky/feed/get_feed_generator.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getFeedGenerator` namespace.
+pub const NSID: &str = "app.bsky.feed.getFeedGenerator";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_feed_generators.rs b/atrium-api/src/app/bsky/feed/get_feed_generators.rs
index 7cc68f03..da491b8b 100644
--- a/atrium-api/src/app/bsky/feed/get_feed_generators.rs
+++ b/atrium-api/src/app/bsky/feed/get_feed_generators.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getFeedGenerators` namespace.
+pub const NSID: &str = "app.bsky.feed.getFeedGenerators";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_feed_skeleton.rs b/atrium-api/src/app/bsky/feed/get_feed_skeleton.rs
index 95858982..825c909e 100644
--- a/atrium-api/src/app/bsky/feed/get_feed_skeleton.rs
+++ b/atrium-api/src/app/bsky/feed/get_feed_skeleton.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getFeedSkeleton` namespace.
+pub const NSID: &str = "app.bsky.feed.getFeedSkeleton";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_likes.rs b/atrium-api/src/app/bsky/feed/get_likes.rs
index dfad5073..9056977d 100644
--- a/atrium-api/src/app/bsky/feed/get_likes.rs
+++ b/atrium-api/src/app/bsky/feed/get_likes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getLikes` namespace.
+pub const NSID: &str = "app.bsky.feed.getLikes";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_list_feed.rs b/atrium-api/src/app/bsky/feed/get_list_feed.rs
index 10517f2c..5be27703 100644
--- a/atrium-api/src/app/bsky/feed/get_list_feed.rs
+++ b/atrium-api/src/app/bsky/feed/get_list_feed.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getListFeed` namespace.
+pub const NSID: &str = "app.bsky.feed.getListFeed";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_post_thread.rs b/atrium-api/src/app/bsky/feed/get_post_thread.rs
index 6912f56c..03259c52 100644
--- a/atrium-api/src/app/bsky/feed/get_post_thread.rs
+++ b/atrium-api/src/app/bsky/feed/get_post_thread.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getPostThread` namespace.
+pub const NSID: &str = "app.bsky.feed.getPostThread";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_posts.rs b/atrium-api/src/app/bsky/feed/get_posts.rs
index f7614db7..d0d68205 100644
--- a/atrium-api/src/app/bsky/feed/get_posts.rs
+++ b/atrium-api/src/app/bsky/feed/get_posts.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getPosts` namespace.
+pub const NSID: &str = "app.bsky.feed.getPosts";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_reposted_by.rs b/atrium-api/src/app/bsky/feed/get_reposted_by.rs
index cfd97ee9..f61a90d0 100644
--- a/atrium-api/src/app/bsky/feed/get_reposted_by.rs
+++ b/atrium-api/src/app/bsky/feed/get_reposted_by.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getRepostedBy` namespace.
+pub const NSID: &str = "app.bsky.feed.getRepostedBy";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_suggested_feeds.rs b/atrium-api/src/app/bsky/feed/get_suggested_feeds.rs
index dbd459df..a31b166c 100644
--- a/atrium-api/src/app/bsky/feed/get_suggested_feeds.rs
+++ b/atrium-api/src/app/bsky/feed/get_suggested_feeds.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getSuggestedFeeds` namespace.
+pub const NSID: &str = "app.bsky.feed.getSuggestedFeeds";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/get_timeline.rs b/atrium-api/src/app/bsky/feed/get_timeline.rs
index 516f0145..44c812ea 100644
--- a/atrium-api/src/app/bsky/feed/get_timeline.rs
+++ b/atrium-api/src/app/bsky/feed/get_timeline.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.getTimeline` namespace.
+pub const NSID: &str = "app.bsky.feed.getTimeline";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/search_posts.rs b/atrium-api/src/app/bsky/feed/search_posts.rs
index 035db0d8..5aa0801d 100644
--- a/atrium-api/src/app/bsky/feed/search_posts.rs
+++ b/atrium-api/src/app/bsky/feed/search_posts.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.searchPosts` namespace.
+pub const NSID: &str = "app.bsky.feed.searchPosts";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/feed/send_interactions.rs b/atrium-api/src/app/bsky/feed/send_interactions.rs
index 79d575de..14f4b980 100644
--- a/atrium-api/src/app/bsky/feed/send_interactions.rs
+++ b/atrium-api/src/app/bsky/feed/send_interactions.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.feed.sendInteractions` namespace.
+pub const NSID: &str = "app.bsky.feed.sendInteractions";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/app/bsky/graph/get_blocks.rs b/atrium-api/src/app/bsky/graph/get_blocks.rs
index 0a2c52e7..66c59923 100644
--- a/atrium-api/src/app/bsky/graph/get_blocks.rs
+++ b/atrium-api/src/app/bsky/graph/get_blocks.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getBlocks` namespace.
+pub const NSID: &str = "app.bsky.graph.getBlocks";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_followers.rs b/atrium-api/src/app/bsky/graph/get_followers.rs
index 5ad11733..e78189ee 100644
--- a/atrium-api/src/app/bsky/graph/get_followers.rs
+++ b/atrium-api/src/app/bsky/graph/get_followers.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getFollowers` namespace.
+pub const NSID: &str = "app.bsky.graph.getFollowers";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_follows.rs b/atrium-api/src/app/bsky/graph/get_follows.rs
index 95b63138..02752bcd 100644
--- a/atrium-api/src/app/bsky/graph/get_follows.rs
+++ b/atrium-api/src/app/bsky/graph/get_follows.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getFollows` namespace.
+pub const NSID: &str = "app.bsky.graph.getFollows";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_list.rs b/atrium-api/src/app/bsky/graph/get_list.rs
index 195796e6..deb87e67 100644
--- a/atrium-api/src/app/bsky/graph/get_list.rs
+++ b/atrium-api/src/app/bsky/graph/get_list.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getList` namespace.
+pub const NSID: &str = "app.bsky.graph.getList";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_list_blocks.rs b/atrium-api/src/app/bsky/graph/get_list_blocks.rs
index 06e6854a..2d343dbf 100644
--- a/atrium-api/src/app/bsky/graph/get_list_blocks.rs
+++ b/atrium-api/src/app/bsky/graph/get_list_blocks.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getListBlocks` namespace.
+pub const NSID: &str = "app.bsky.graph.getListBlocks";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_list_mutes.rs b/atrium-api/src/app/bsky/graph/get_list_mutes.rs
index 8871ffba..1aed6c3b 100644
--- a/atrium-api/src/app/bsky/graph/get_list_mutes.rs
+++ b/atrium-api/src/app/bsky/graph/get_list_mutes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getListMutes` namespace.
+pub const NSID: &str = "app.bsky.graph.getListMutes";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_lists.rs b/atrium-api/src/app/bsky/graph/get_lists.rs
index 093ac48f..6a47cfe1 100644
--- a/atrium-api/src/app/bsky/graph/get_lists.rs
+++ b/atrium-api/src/app/bsky/graph/get_lists.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getLists` namespace.
+pub const NSID: &str = "app.bsky.graph.getLists";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_mutes.rs b/atrium-api/src/app/bsky/graph/get_mutes.rs
index c7fad11f..e4aa7a46 100644
--- a/atrium-api/src/app/bsky/graph/get_mutes.rs
+++ b/atrium-api/src/app/bsky/graph/get_mutes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getMutes` namespace.
+pub const NSID: &str = "app.bsky.graph.getMutes";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_relationships.rs b/atrium-api/src/app/bsky/graph/get_relationships.rs
index a92265a4..607f04d7 100644
--- a/atrium-api/src/app/bsky/graph/get_relationships.rs
+++ b/atrium-api/src/app/bsky/graph/get_relationships.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getRelationships` namespace.
+pub const NSID: &str = "app.bsky.graph.getRelationships";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/get_suggested_follows_by_actor.rs b/atrium-api/src/app/bsky/graph/get_suggested_follows_by_actor.rs
index 1a0aec97..60a50713 100644
--- a/atrium-api/src/app/bsky/graph/get_suggested_follows_by_actor.rs
+++ b/atrium-api/src/app/bsky/graph/get_suggested_follows_by_actor.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.getSuggestedFollowsByActor` namespace.
+pub const NSID: &str = "app.bsky.graph.getSuggestedFollowsByActor";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/graph/mute_actor.rs b/atrium-api/src/app/bsky/graph/mute_actor.rs
index e1361348..60c9a429 100644
--- a/atrium-api/src/app/bsky/graph/mute_actor.rs
+++ b/atrium-api/src/app/bsky/graph/mute_actor.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.muteActor` namespace.
+pub const NSID: &str = "app.bsky.graph.muteActor";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/app/bsky/graph/mute_actor_list.rs b/atrium-api/src/app/bsky/graph/mute_actor_list.rs
index 527c5831..4b55ebf1 100644
--- a/atrium-api/src/app/bsky/graph/mute_actor_list.rs
+++ b/atrium-api/src/app/bsky/graph/mute_actor_list.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.muteActorList` namespace.
+pub const NSID: &str = "app.bsky.graph.muteActorList";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/app/bsky/graph/unmute_actor.rs b/atrium-api/src/app/bsky/graph/unmute_actor.rs
index a377fe4d..f60b1833 100644
--- a/atrium-api/src/app/bsky/graph/unmute_actor.rs
+++ b/atrium-api/src/app/bsky/graph/unmute_actor.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.unmuteActor` namespace.
+pub const NSID: &str = "app.bsky.graph.unmuteActor";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/app/bsky/graph/unmute_actor_list.rs b/atrium-api/src/app/bsky/graph/unmute_actor_list.rs
index 3f0665dd..d2b1bd96 100644
--- a/atrium-api/src/app/bsky/graph/unmute_actor_list.rs
+++ b/atrium-api/src/app/bsky/graph/unmute_actor_list.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.graph.unmuteActorList` namespace.
+pub const NSID: &str = "app.bsky.graph.unmuteActorList";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/app/bsky/labeler/get_services.rs b/atrium-api/src/app/bsky/labeler/get_services.rs
index 6a66f96a..a7019651 100644
--- a/atrium-api/src/app/bsky/labeler/get_services.rs
+++ b/atrium-api/src/app/bsky/labeler/get_services.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.labeler.getServices` namespace.
+pub const NSID: &str = "app.bsky.labeler.getServices";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/notification/get_unread_count.rs b/atrium-api/src/app/bsky/notification/get_unread_count.rs
index 677d6cb9..edde6028 100644
--- a/atrium-api/src/app/bsky/notification/get_unread_count.rs
+++ b/atrium-api/src/app/bsky/notification/get_unread_count.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.notification.getUnreadCount` namespace.
+pub const NSID: &str = "app.bsky.notification.getUnreadCount";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/notification/list_notifications.rs b/atrium-api/src/app/bsky/notification/list_notifications.rs
index 4273c947..eba978ff 100644
--- a/atrium-api/src/app/bsky/notification/list_notifications.rs
+++ b/atrium-api/src/app/bsky/notification/list_notifications.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.notification.listNotifications` namespace.
+pub const NSID: &str = "app.bsky.notification.listNotifications";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/notification/register_push.rs b/atrium-api/src/app/bsky/notification/register_push.rs
index bf2d03d9..37dc2b10 100644
--- a/atrium-api/src/app/bsky/notification/register_push.rs
+++ b/atrium-api/src/app/bsky/notification/register_push.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.notification.registerPush` namespace.
+pub const NSID: &str = "app.bsky.notification.registerPush";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/app/bsky/notification/update_seen.rs b/atrium-api/src/app/bsky/notification/update_seen.rs
index ecf250fb..1da03d7f 100644
--- a/atrium-api/src/app/bsky/notification/update_seen.rs
+++ b/atrium-api/src/app/bsky/notification/update_seen.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.notification.updateSeen` namespace.
+pub const NSID: &str = "app.bsky.notification.updateSeen";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/app/bsky/unspecced/get_popular_feed_generators.rs b/atrium-api/src/app/bsky/unspecced/get_popular_feed_generators.rs
index 645dfe02..95553d7d 100644
--- a/atrium-api/src/app/bsky/unspecced/get_popular_feed_generators.rs
+++ b/atrium-api/src/app/bsky/unspecced/get_popular_feed_generators.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.unspecced.getPopularFeedGenerators` namespace.
+pub const NSID: &str = "app.bsky.unspecced.getPopularFeedGenerators";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/unspecced/get_suggestions_skeleton.rs b/atrium-api/src/app/bsky/unspecced/get_suggestions_skeleton.rs
index 0cc0af0b..1fb10f95 100644
--- a/atrium-api/src/app/bsky/unspecced/get_suggestions_skeleton.rs
+++ b/atrium-api/src/app/bsky/unspecced/get_suggestions_skeleton.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.unspecced.getSuggestionsSkeleton` namespace.
+pub const NSID: &str = "app.bsky.unspecced.getSuggestionsSkeleton";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/unspecced/get_tagged_suggestions.rs b/atrium-api/src/app/bsky/unspecced/get_tagged_suggestions.rs
index 86a0836e..61957a71 100644
--- a/atrium-api/src/app/bsky/unspecced/get_tagged_suggestions.rs
+++ b/atrium-api/src/app/bsky/unspecced/get_tagged_suggestions.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.unspecced.getTaggedSuggestions` namespace.
+pub const NSID: &str = "app.bsky.unspecced.getTaggedSuggestions";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {}
diff --git a/atrium-api/src/app/bsky/unspecced/search_actors_skeleton.rs b/atrium-api/src/app/bsky/unspecced/search_actors_skeleton.rs
index 7b8d2ff9..63e73d6e 100644
--- a/atrium-api/src/app/bsky/unspecced/search_actors_skeleton.rs
+++ b/atrium-api/src/app/bsky/unspecced/search_actors_skeleton.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.unspecced.searchActorsSkeleton` namespace.
+pub const NSID: &str = "app.bsky.unspecced.searchActorsSkeleton";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/app/bsky/unspecced/search_posts_skeleton.rs b/atrium-api/src/app/bsky/unspecced/search_posts_skeleton.rs
index ae96e9d0..06be04f2 100644
--- a/atrium-api/src/app/bsky/unspecced/search_posts_skeleton.rs
+++ b/atrium-api/src/app/bsky/unspecced/search_posts_skeleton.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `app.bsky.unspecced.searchPostsSkeleton` namespace.
+pub const NSID: &str = "app.bsky.unspecced.searchPostsSkeleton";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/chat/bsky/actor/delete_account.rs b/atrium-api/src/chat/bsky/actor/delete_account.rs
index 69201708..5bd1b384 100644
--- a/atrium-api/src/chat/bsky/actor/delete_account.rs
+++ b/atrium-api/src/chat/bsky/actor/delete_account.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.actor.deleteAccount` namespace.
+pub const NSID: &str = "chat.bsky.actor.deleteAccount";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {}
diff --git a/atrium-api/src/chat/bsky/actor/export_account_data.rs b/atrium-api/src/chat/bsky/actor/export_account_data.rs
index e386d012..fc68a323 100644
--- a/atrium-api/src/chat/bsky/actor/export_account_data.rs
+++ b/atrium-api/src/chat/bsky/actor/export_account_data.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.actor.exportAccountData` namespace.
+pub const NSID: &str = "chat.bsky.actor.exportAccountData";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(tag = "error", content = "message")]
 pub enum Error {}
diff --git a/atrium-api/src/chat/bsky/convo/defs.rs b/atrium-api/src/chat/bsky/convo/defs.rs
index 7047b8b0..4cac98a6 100644
--- a/atrium-api/src/chat/bsky/convo/defs.rs
+++ b/atrium-api/src/chat/bsky/convo/defs.rs
@@ -47,19 +47,18 @@ pub struct LogLeaveConvo {
 }
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
-pub struct Message {
+pub struct MessageInput {
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed: Option<crate::types::Union<MessageEmbedRefs>>,
+    pub embed: Option<crate::types::Union<MessageInputEmbedRefs>>,
     ///Annotations of text (mentions, URLs, hashtags, etc)
     #[serde(skip_serializing_if = "Option::is_none")]
     pub facets: Option<Vec<crate::app::bsky::richtext::facet::Main>>,
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
     pub text: String,
 }
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct MessageRef {
+    pub convo_id: String,
     pub did: crate::types::string::Did,
     pub message_id: String,
 }
@@ -108,7 +107,7 @@ pub enum LogDeleteMessageMessageRefs {
 }
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(tag = "$type")]
-pub enum MessageEmbedRefs {
+pub enum MessageInputEmbedRefs {
     #[serde(rename = "app.bsky.embed.record")]
     AppBskyEmbedRecordMain(Box<crate::app::bsky::embed::record::Main>),
 }
diff --git a/atrium-api/src/chat/bsky/convo/delete_message_for_self.rs b/atrium-api/src/chat/bsky/convo/delete_message_for_self.rs
index fcd9551f..4b90480b 100644
--- a/atrium-api/src/chat/bsky/convo/delete_message_for_self.rs
+++ b/atrium-api/src/chat/bsky/convo/delete_message_for_self.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.deleteMessageForSelf` namespace.
+pub const NSID: &str = "chat.bsky.convo.deleteMessageForSelf";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/chat/bsky/convo/get_convo.rs b/atrium-api/src/chat/bsky/convo/get_convo.rs
index 6f8e5f62..b70654d0 100644
--- a/atrium-api/src/chat/bsky/convo/get_convo.rs
+++ b/atrium-api/src/chat/bsky/convo/get_convo.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.getConvo` namespace.
+pub const NSID: &str = "chat.bsky.convo.getConvo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/chat/bsky/convo/get_convo_for_members.rs b/atrium-api/src/chat/bsky/convo/get_convo_for_members.rs
index 614aa489..a0e8457f 100644
--- a/atrium-api/src/chat/bsky/convo/get_convo_for_members.rs
+++ b/atrium-api/src/chat/bsky/convo/get_convo_for_members.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.getConvoForMembers` namespace.
+pub const NSID: &str = "chat.bsky.convo.getConvoForMembers";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/chat/bsky/convo/get_log.rs b/atrium-api/src/chat/bsky/convo/get_log.rs
index d76823d8..cc007f2e 100644
--- a/atrium-api/src/chat/bsky/convo/get_log.rs
+++ b/atrium-api/src/chat/bsky/convo/get_log.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.getLog` namespace.
+pub const NSID: &str = "chat.bsky.convo.getLog";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/chat/bsky/convo/get_messages.rs b/atrium-api/src/chat/bsky/convo/get_messages.rs
index a408b528..e1003a66 100644
--- a/atrium-api/src/chat/bsky/convo/get_messages.rs
+++ b/atrium-api/src/chat/bsky/convo/get_messages.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.getMessages` namespace.
+pub const NSID: &str = "chat.bsky.convo.getMessages";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/chat/bsky/convo/leave_convo.rs b/atrium-api/src/chat/bsky/convo/leave_convo.rs
index 229762a8..a7f073de 100644
--- a/atrium-api/src/chat/bsky/convo/leave_convo.rs
+++ b/atrium-api/src/chat/bsky/convo/leave_convo.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.leaveConvo` namespace.
+pub const NSID: &str = "chat.bsky.convo.leaveConvo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/chat/bsky/convo/list_convos.rs b/atrium-api/src/chat/bsky/convo/list_convos.rs
index a19d6c42..0aea8d2b 100644
--- a/atrium-api/src/chat/bsky/convo/list_convos.rs
+++ b/atrium-api/src/chat/bsky/convo/list_convos.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.listConvos` namespace.
+pub const NSID: &str = "chat.bsky.convo.listConvos";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/chat/bsky/convo/mute_convo.rs b/atrium-api/src/chat/bsky/convo/mute_convo.rs
index 814b7a3f..842d03e6 100644
--- a/atrium-api/src/chat/bsky/convo/mute_convo.rs
+++ b/atrium-api/src/chat/bsky/convo/mute_convo.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.muteConvo` namespace.
+pub const NSID: &str = "chat.bsky.convo.muteConvo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/chat/bsky/convo/send_message.rs b/atrium-api/src/chat/bsky/convo/send_message.rs
index ae17a160..98a4237b 100644
--- a/atrium-api/src/chat/bsky/convo/send_message.rs
+++ b/atrium-api/src/chat/bsky/convo/send_message.rs
@@ -1,10 +1,11 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.sendMessage` namespace.
+pub const NSID: &str = "chat.bsky.convo.sendMessage";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
     pub convo_id: String,
-    pub message: crate::chat::bsky::convo::defs::Message,
+    pub message: crate::chat::bsky::convo::defs::MessageInput,
 }
 pub type Output = crate::chat::bsky::convo::defs::MessageView;
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
diff --git a/atrium-api/src/chat/bsky/convo/send_message_batch.rs b/atrium-api/src/chat/bsky/convo/send_message_batch.rs
index 1b039bfd..389c478c 100644
--- a/atrium-api/src/chat/bsky/convo/send_message_batch.rs
+++ b/atrium-api/src/chat/bsky/convo/send_message_batch.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.sendMessageBatch` namespace.
+pub const NSID: &str = "chat.bsky.convo.sendMessageBatch";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
@@ -22,5 +23,5 @@ impl std::fmt::Display for Error {
 #[serde(rename_all = "camelCase")]
 pub struct BatchItem {
     pub convo_id: String,
-    pub message: crate::chat::bsky::convo::defs::Message,
+    pub message: crate::chat::bsky::convo::defs::MessageInput,
 }
diff --git a/atrium-api/src/chat/bsky/convo/unmute_convo.rs b/atrium-api/src/chat/bsky/convo/unmute_convo.rs
index a3d7049c..6fa19eac 100644
--- a/atrium-api/src/chat/bsky/convo/unmute_convo.rs
+++ b/atrium-api/src/chat/bsky/convo/unmute_convo.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.unmuteConvo` namespace.
+pub const NSID: &str = "chat.bsky.convo.unmuteConvo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/chat/bsky/convo/update_read.rs b/atrium-api/src/chat/bsky/convo/update_read.rs
index 93f34159..e69ee90b 100644
--- a/atrium-api/src/chat/bsky/convo/update_read.rs
+++ b/atrium-api/src/chat/bsky/convo/update_read.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.convo.updateRead` namespace.
+pub const NSID: &str = "chat.bsky.convo.updateRead";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/chat/bsky/moderation/get_actor_metadata.rs b/atrium-api/src/chat/bsky/moderation/get_actor_metadata.rs
index c6f69f85..537fc06d 100644
--- a/atrium-api/src/chat/bsky/moderation/get_actor_metadata.rs
+++ b/atrium-api/src/chat/bsky/moderation/get_actor_metadata.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.moderation.getActorMetadata` namespace.
+pub const NSID: &str = "chat.bsky.moderation.getActorMetadata";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/chat/bsky/moderation/get_message_context.rs b/atrium-api/src/chat/bsky/moderation/get_message_context.rs
index 555470c4..207ff797 100644
--- a/atrium-api/src/chat/bsky/moderation/get_message_context.rs
+++ b/atrium-api/src/chat/bsky/moderation/get_message_context.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.moderation.getMessageContext` namespace.
+pub const NSID: &str = "chat.bsky.moderation.getMessageContext";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
@@ -7,6 +8,9 @@ pub struct Parameters {
     pub after: Option<i64>,
     #[serde(skip_serializing_if = "Option::is_none")]
     pub before: Option<i64>,
+    ///Conversation that the message is from. NOTE: this field will eventually be required.
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub convo_id: Option<String>,
     pub message_id: String,
 }
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
diff --git a/atrium-api/src/chat/bsky/moderation/update_actor_access.rs b/atrium-api/src/chat/bsky/moderation/update_actor_access.rs
index b1b50046..be373a74 100644
--- a/atrium-api/src/chat/bsky/moderation/update_actor_access.rs
+++ b/atrium-api/src/chat/bsky/moderation/update_actor_access.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `chat.bsky.moderation.updateActorAccess` namespace.
+pub const NSID: &str = "chat.bsky.moderation.updateActorAccess";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/client.rs b/atrium-api/src/client.rs
index 8b8bc69d..5bbda15c 100644
--- a/atrium-api/src/client.rs
+++ b/atrium-api/src/client.rs
@@ -375,7 +375,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.actor.getPreferences".into(),
+                    nsid: crate::app::bsky::actor::get_preferences::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -405,7 +405,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.actor.getProfile".into(),
+                    nsid: crate::app::bsky::actor::get_profile::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -435,7 +435,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.actor.getProfiles".into(),
+                    nsid: crate::app::bsky::actor::get_profiles::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -465,7 +465,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.actor.getSuggestions".into(),
+                    nsid: crate::app::bsky::actor::get_suggestions::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -492,7 +492,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "app.bsky.actor.putPreferences".into(),
+                    nsid: crate::app::bsky::actor::put_preferences::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -522,7 +522,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.actor.searchActors".into(),
+                    nsid: crate::app::bsky::actor::search_actors::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -552,7 +552,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.actor.searchActorsTypeahead".into(),
+                    nsid: crate::app::bsky::actor::search_actors_typeahead::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -594,7 +594,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.describeFeedGenerator".into(),
+                    nsid: crate::app::bsky::feed::describe_feed_generator::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -624,7 +624,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getActorFeeds".into(),
+                    nsid: crate::app::bsky::feed::get_actor_feeds::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -654,7 +654,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getActorLikes".into(),
+                    nsid: crate::app::bsky::feed::get_actor_likes::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -684,7 +684,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getAuthorFeed".into(),
+                    nsid: crate::app::bsky::feed::get_author_feed::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -714,7 +714,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getFeed".into(),
+                    nsid: crate::app::bsky::feed::get_feed::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -744,7 +744,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getFeedGenerator".into(),
+                    nsid: crate::app::bsky::feed::get_feed_generator::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -774,7 +774,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getFeedGenerators".into(),
+                    nsid: crate::app::bsky::feed::get_feed_generators::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -804,7 +804,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getFeedSkeleton".into(),
+                    nsid: crate::app::bsky::feed::get_feed_skeleton::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -834,7 +834,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getLikes".into(),
+                    nsid: crate::app::bsky::feed::get_likes::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -864,7 +864,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getListFeed".into(),
+                    nsid: crate::app::bsky::feed::get_list_feed::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -894,7 +894,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getPostThread".into(),
+                    nsid: crate::app::bsky::feed::get_post_thread::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -924,7 +924,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getPosts".into(),
+                    nsid: crate::app::bsky::feed::get_posts::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -954,7 +954,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getRepostedBy".into(),
+                    nsid: crate::app::bsky::feed::get_reposted_by::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -984,7 +984,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getSuggestedFeeds".into(),
+                    nsid: crate::app::bsky::feed::get_suggested_feeds::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1014,7 +1014,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.getTimeline".into(),
+                    nsid: crate::app::bsky::feed::get_timeline::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1044,7 +1044,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.feed.searchPosts".into(),
+                    nsid: crate::app::bsky::feed::search_posts::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1074,7 +1074,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "app.bsky.feed.sendInteractions".into(),
+                    nsid: crate::app::bsky::feed::send_interactions::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -1117,7 +1117,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getBlocks".into(),
+                    nsid: crate::app::bsky::graph::get_blocks::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1147,7 +1147,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getFollowers".into(),
+                    nsid: crate::app::bsky::graph::get_followers::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1177,7 +1177,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getFollows".into(),
+                    nsid: crate::app::bsky::graph::get_follows::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1207,7 +1207,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getList".into(),
+                    nsid: crate::app::bsky::graph::get_list::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1237,7 +1237,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getListBlocks".into(),
+                    nsid: crate::app::bsky::graph::get_list_blocks::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1267,7 +1267,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getListMutes".into(),
+                    nsid: crate::app::bsky::graph::get_list_mutes::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1297,7 +1297,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getLists".into(),
+                    nsid: crate::app::bsky::graph::get_lists::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1327,7 +1327,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getMutes".into(),
+                    nsid: crate::app::bsky::graph::get_mutes::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1357,7 +1357,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getRelationships".into(),
+                    nsid: crate::app::bsky::graph::get_relationships::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1387,7 +1387,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.graph.getSuggestedFollowsByActor".into(),
+                    nsid: crate::app::bsky::graph::get_suggested_follows_by_actor::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1414,7 +1415,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "app.bsky.graph.muteActor".into(),
+                    nsid: crate::app::bsky::graph::mute_actor::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -1441,7 +1442,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "app.bsky.graph.muteActorList".into(),
+                    nsid: crate::app::bsky::graph::mute_actor_list::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -1468,7 +1469,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "app.bsky.graph.unmuteActor".into(),
+                    nsid: crate::app::bsky::graph::unmute_actor::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -1495,7 +1496,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "app.bsky.graph.unmuteActorList".into(),
+                    nsid: crate::app::bsky::graph::unmute_actor_list::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -1538,7 +1539,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.labeler.getServices".into(),
+                    nsid: crate::app::bsky::labeler::get_services::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1581,7 +1582,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.notification.getUnreadCount".into(),
+                    nsid: crate::app::bsky::notification::get_unread_count::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1611,7 +1612,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.notification.listNotifications".into(),
+                    nsid: crate::app::bsky::notification::list_notifications::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1638,7 +1640,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "app.bsky.notification.registerPush".into(),
+                    nsid: crate::app::bsky::notification::register_push::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -1665,7 +1667,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "app.bsky.notification.updateSeen".into(),
+                    nsid: crate::app::bsky::notification::update_seen::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -1708,7 +1710,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.unspecced.getPopularFeedGenerators".into(),
+                    nsid: crate::app::bsky::unspecced::get_popular_feed_generators::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1738,7 +1741,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.unspecced.getSuggestionsSkeleton".into(),
+                    nsid: crate::app::bsky::unspecced::get_suggestions_skeleton::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1768,7 +1772,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.unspecced.getTaggedSuggestions".into(),
+                    nsid: crate::app::bsky::unspecced::get_tagged_suggestions::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1798,7 +1803,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.unspecced.searchActorsSkeleton".into(),
+                    nsid: crate::app::bsky::unspecced::search_actors_skeleton::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1828,7 +1834,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "app.bsky.unspecced.searchPostsSkeleton".into(),
+                    nsid: crate::app::bsky::unspecced::search_posts_skeleton::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -1899,7 +1906,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.actor.deleteAccount".into(),
+                    nsid: crate::chat::bsky::actor::delete_account::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -1927,7 +1934,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "chat.bsky.actor.exportAccountData".into(),
+                    nsid: crate::chat::bsky::actor::export_account_data::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -1969,7 +1976,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.convo.deleteMessageForSelf".into(),
+                    nsid: crate::chat::bsky::convo::delete_message_for_self::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -1998,7 +2005,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "chat.bsky.convo.getConvo".into(),
+                    nsid: crate::chat::bsky::convo::get_convo::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2027,7 +2034,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "chat.bsky.convo.getConvoForMembers".into(),
+                    nsid: crate::chat::bsky::convo::get_convo_for_members::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2056,7 +2063,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "chat.bsky.convo.getLog".into(),
+                    nsid: crate::chat::bsky::convo::get_log::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2085,7 +2092,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "chat.bsky.convo.getMessages".into(),
+                    nsid: crate::chat::bsky::convo::get_messages::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2114,7 +2121,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.convo.leaveConvo".into(),
+                    nsid: crate::chat::bsky::convo::leave_convo::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2143,7 +2150,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "chat.bsky.convo.listConvos".into(),
+                    nsid: crate::chat::bsky::convo::list_convos::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2172,7 +2179,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.convo.muteConvo".into(),
+                    nsid: crate::chat::bsky::convo::mute_convo::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2201,7 +2208,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.convo.sendMessage".into(),
+                    nsid: crate::chat::bsky::convo::send_message::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2230,7 +2237,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.convo.sendMessageBatch".into(),
+                    nsid: crate::chat::bsky::convo::send_message_batch::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2259,7 +2266,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.convo.unmuteConvo".into(),
+                    nsid: crate::chat::bsky::convo::unmute_convo::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2288,7 +2295,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.convo.updateRead".into(),
+                    nsid: crate::chat::bsky::convo::update_read::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2330,7 +2337,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "chat.bsky.moderation.getActorMetadata".into(),
+                    nsid: crate::chat::bsky::moderation::get_actor_metadata::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2359,7 +2366,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "chat.bsky.moderation.getMessageContext".into(),
+                    nsid: crate::chat::bsky::moderation::get_message_context::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2388,7 +2396,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "chat.bsky.moderation.updateActorAccess".into(),
+                    nsid: crate::chat::bsky::moderation::update_actor_access::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2460,7 +2469,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.deleteAccount".into(),
+                    nsid: crate::com::atproto::admin::delete_account::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2490,7 +2499,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.disableAccountInvites".into(),
+                    nsid: crate::com::atproto::admin::disable_account_invites::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2520,7 +2530,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.disableInviteCodes".into(),
+                    nsid: crate::com::atproto::admin::disable_invite_codes::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2550,7 +2560,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.enableAccountInvites".into(),
+                    nsid: crate::com::atproto::admin::enable_account_invites::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2580,7 +2591,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.admin.getAccountInfo".into(),
+                    nsid: crate::com::atproto::admin::get_account_info::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2610,7 +2621,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.admin.getAccountInfos".into(),
+                    nsid: crate::com::atproto::admin::get_account_infos::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2640,7 +2651,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.admin.getInviteCodes".into(),
+                    nsid: crate::com::atproto::admin::get_invite_codes::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2670,7 +2681,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.admin.getSubjectStatus".into(),
+                    nsid: crate::com::atproto::admin::get_subject_status::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2700,7 +2711,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.sendEmail".into(),
+                    nsid: crate::com::atproto::admin::send_email::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2730,7 +2741,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.updateAccountEmail".into(),
+                    nsid: crate::com::atproto::admin::update_account_email::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2760,7 +2771,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.updateAccountHandle".into(),
+                    nsid: crate::com::atproto::admin::update_account_handle::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2790,7 +2801,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.updateAccountPassword".into(),
+                    nsid: crate::com::atproto::admin::update_account_password::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2820,7 +2832,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.admin.updateSubjectStatus".into(),
+                    nsid: crate::com::atproto::admin::update_subject_status::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2861,7 +2873,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.identity.getRecommendedDidCredentials".into(),
+                    nsid: crate::com::atproto::identity::get_recommended_did_credentials::NSID
+                        .into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -2890,7 +2903,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.identity.requestPlcOperationSignature".into(),
+                    nsid: crate::com::atproto::identity::request_plc_operation_signature::NSID
+                        .into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -2920,7 +2934,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.identity.resolveHandle".into(),
+                    nsid: crate::com::atproto::identity::resolve_handle::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -2950,7 +2964,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.identity.signPlcOperation".into(),
+                    nsid: crate::com::atproto::identity::sign_plc_operation::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -2980,7 +2994,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.identity.submitPlcOperation".into(),
+                    nsid: crate::com::atproto::identity::submit_plc_operation::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3007,7 +3022,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.identity.updateHandle".into(),
+                    nsid: crate::com::atproto::identity::update_handle::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3049,7 +3064,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.label.queryLabels".into(),
+                    nsid: crate::com::atproto::label::query_labels::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -3091,7 +3106,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.moderation.createReport".into(),
+                    nsid: crate::com::atproto::moderation::create_report::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3130,7 +3145,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.repo.applyWrites".into(),
+                    nsid: crate::com::atproto::repo::apply_writes::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3160,7 +3175,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.repo.createRecord".into(),
+                    nsid: crate::com::atproto::repo::create_record::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3187,7 +3202,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.repo.deleteRecord".into(),
+                    nsid: crate::com::atproto::repo::delete_record::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3217,7 +3232,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.repo.describeRepo".into(),
+                    nsid: crate::com::atproto::repo::describe_repo::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -3247,7 +3262,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.repo.getRecord".into(),
+                    nsid: crate::com::atproto::repo::get_record::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -3274,7 +3289,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.repo.importRepo".into(),
+                    nsid: crate::com::atproto::repo::import_repo::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Bytes(input)),
                     encoding: Some(String::from("application/vnd.ipld.car")),
@@ -3304,7 +3319,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.repo.listMissingBlobs".into(),
+                    nsid: crate::com::atproto::repo::list_missing_blobs::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -3334,7 +3349,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.repo.listRecords".into(),
+                    nsid: crate::com::atproto::repo::list_records::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -3364,7 +3379,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.repo.putRecord".into(),
+                    nsid: crate::com::atproto::repo::put_record::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3394,7 +3409,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.repo.uploadBlob".into(),
+                    nsid: crate::com::atproto::repo::upload_blob::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Bytes(input)),
                     encoding: Some(String::from("*/*")),
@@ -3432,7 +3447,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.activateAccount".into(),
+                    nsid: crate::com::atproto::server::activate_account::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3461,7 +3476,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.server.checkAccountStatus".into(),
+                    nsid: crate::com::atproto::server::check_account_status::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3488,7 +3503,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.confirmEmail".into(),
+                    nsid: crate::com::atproto::server::confirm_email::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3518,7 +3533,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.createAccount".into(),
+                    nsid: crate::com::atproto::server::create_account::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3548,7 +3563,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.createAppPassword".into(),
+                    nsid: crate::com::atproto::server::create_app_password::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3578,7 +3593,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.createInviteCode".into(),
+                    nsid: crate::com::atproto::server::create_invite_code::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3608,7 +3623,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.createInviteCodes".into(),
+                    nsid: crate::com::atproto::server::create_invite_codes::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3638,7 +3653,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.createSession".into(),
+                    nsid: crate::com::atproto::server::create_session::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3668,7 +3683,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.deactivateAccount".into(),
+                    nsid: crate::com::atproto::server::deactivate_account::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3695,7 +3710,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.deleteAccount".into(),
+                    nsid: crate::com::atproto::server::delete_account::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -3721,7 +3736,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.deleteSession".into(),
+                    nsid: crate::com::atproto::server::delete_session::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3750,7 +3765,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.server.describeServer".into(),
+                    nsid: crate::com::atproto::server::describe_server::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3780,7 +3795,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.server.getAccountInviteCodes".into(),
+                    nsid: crate::com::atproto::server::get_account_invite_codes::NSID
+                        .into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -3810,7 +3826,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.server.getServiceAuth".into(),
+                    nsid: crate::com::atproto::server::get_service_auth::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -3839,7 +3855,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.server.getSession".into(),
+                    nsid: crate::com::atproto::server::get_session::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3868,7 +3884,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.server.listAppPasswords".into(),
+                    nsid: crate::com::atproto::server::list_app_passwords::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3897,7 +3913,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.refreshSession".into(),
+                    nsid: crate::com::atproto::server::refresh_session::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3926,7 +3942,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.requestAccountDelete".into(),
+                    nsid: crate::com::atproto::server::request_account_delete::NSID
+                        .into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3955,7 +3972,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.requestEmailConfirmation".into(),
+                    nsid: crate::com::atproto::server::request_email_confirmation::NSID
+                        .into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -3984,7 +4002,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.requestEmailUpdate".into(),
+                    nsid: crate::com::atproto::server::request_email_update::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -4014,7 +4032,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.requestPasswordReset".into(),
+                    nsid: crate::com::atproto::server::request_password_reset::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4044,7 +4063,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.reserveSigningKey".into(),
+                    nsid: crate::com::atproto::server::reserve_signing_key::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4071,7 +4090,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.resetPassword".into(),
+                    nsid: crate::com::atproto::server::reset_password::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4101,7 +4120,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.revokeAppPassword".into(),
+                    nsid: crate::com::atproto::server::revoke_app_password::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4128,7 +4147,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.server.updateEmail".into(),
+                    nsid: crate::com::atproto::server::update_email::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4167,7 +4186,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.getBlob".into(),
+                    nsid: crate::com::atproto::sync::get_blob::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4194,7 +4213,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.getBlocks".into(),
+                    nsid: crate::com::atproto::sync::get_blocks::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4221,7 +4240,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.getCheckout".into(),
+                    nsid: crate::com::atproto::sync::get_checkout::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4251,7 +4270,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.getHead".into(),
+                    nsid: crate::com::atproto::sync::get_head::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4281,7 +4300,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.getLatestCommit".into(),
+                    nsid: crate::com::atproto::sync::get_latest_commit::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4308,7 +4327,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.getRecord".into(),
+                    nsid: crate::com::atproto::sync::get_record::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4335,7 +4354,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.getRepo".into(),
+                    nsid: crate::com::atproto::sync::get_repo::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4365,7 +4384,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.listBlobs".into(),
+                    nsid: crate::com::atproto::sync::list_blobs::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4395,7 +4414,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.sync.listRepos".into(),
+                    nsid: crate::com::atproto::sync::list_repos::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4422,7 +4441,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.sync.notifyOfUpdate".into(),
+                    nsid: crate::com::atproto::sync::notify_of_update::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4449,7 +4468,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.sync.requestCrawl".into(),
+                    nsid: crate::com::atproto::sync::request_crawl::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4490,7 +4509,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.temp.checkSignupQueue".into(),
+                    nsid: crate::com::atproto::temp::check_signup_queue::NSID.into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -4520,7 +4539,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "com.atproto.temp.fetchLabels".into(),
+                    nsid: crate::com::atproto::temp::fetch_labels::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4550,7 +4569,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "com.atproto.temp.requestPhoneVerification".into(),
+                    nsid: crate::com::atproto::temp::request_phone_verification::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4624,7 +4644,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "tools.ozone.communication.createTemplate".into(),
+                    nsid: crate::tools::ozone::communication::create_template::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4654,7 +4675,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "tools.ozone.communication.deleteTemplate".into(),
+                    nsid: crate::tools::ozone::communication::delete_template::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4683,7 +4705,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "tools.ozone.communication.listTemplates".into(),
+                    nsid: crate::tools::ozone::communication::list_templates::NSID
+                        .into(),
                     parameters: None,
                     input: None,
                     encoding: None,
@@ -4713,7 +4736,8 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "tools.ozone.communication.updateTemplate".into(),
+                    nsid: crate::tools::ozone::communication::update_template::NSID
+                        .into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4756,7 +4780,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::POST,
-                    path: "tools.ozone.moderation.emitEvent".into(),
+                    nsid: crate::tools::ozone::moderation::emit_event::NSID.into(),
                     parameters: None,
                     input: Some(atrium_xrpc::InputDataOrBytes::Data(input)),
                     encoding: Some(String::from("application/json")),
@@ -4786,7 +4810,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "tools.ozone.moderation.getEvent".into(),
+                    nsid: crate::tools::ozone::moderation::get_event::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4816,7 +4840,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "tools.ozone.moderation.getRecord".into(),
+                    nsid: crate::tools::ozone::moderation::get_record::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4846,7 +4870,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "tools.ozone.moderation.getRepo".into(),
+                    nsid: crate::tools::ozone::moderation::get_repo::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4876,7 +4900,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "tools.ozone.moderation.queryEvents".into(),
+                    nsid: crate::tools::ozone::moderation::query_events::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4906,7 +4930,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "tools.ozone.moderation.queryStatuses".into(),
+                    nsid: crate::tools::ozone::moderation::query_statuses::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -4936,7 +4960,7 @@ where
             >(
                 &atrium_xrpc::XrpcRequest {
                     method: http::Method::GET,
-                    path: "tools.ozone.moderation.searchRepos".into(),
+                    nsid: crate::tools::ozone::moderation::search_repos::NSID.into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
diff --git a/atrium-api/src/com/atproto/admin/delete_account.rs b/atrium-api/src/com/atproto/admin/delete_account.rs
index 6d0c40f4..673e06f6 100644
--- a/atrium-api/src/com/atproto/admin/delete_account.rs
+++ b/atrium-api/src/com/atproto/admin/delete_account.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.deleteAccount` namespace.
+pub const NSID: &str = "com.atproto.admin.deleteAccount";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/admin/disable_account_invites.rs b/atrium-api/src/com/atproto/admin/disable_account_invites.rs
index e03a1819..a37e3e19 100644
--- a/atrium-api/src/com/atproto/admin/disable_account_invites.rs
+++ b/atrium-api/src/com/atproto/admin/disable_account_invites.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.disableAccountInvites` namespace.
+pub const NSID: &str = "com.atproto.admin.disableAccountInvites";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/admin/disable_invite_codes.rs b/atrium-api/src/com/atproto/admin/disable_invite_codes.rs
index 4e1bdb91..58f7bd74 100644
--- a/atrium-api/src/com/atproto/admin/disable_invite_codes.rs
+++ b/atrium-api/src/com/atproto/admin/disable_invite_codes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.disableInviteCodes` namespace.
+pub const NSID: &str = "com.atproto.admin.disableInviteCodes";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/admin/enable_account_invites.rs b/atrium-api/src/com/atproto/admin/enable_account_invites.rs
index 0475255f..526b452e 100644
--- a/atrium-api/src/com/atproto/admin/enable_account_invites.rs
+++ b/atrium-api/src/com/atproto/admin/enable_account_invites.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.enableAccountInvites` namespace.
+pub const NSID: &str = "com.atproto.admin.enableAccountInvites";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/admin/get_account_info.rs b/atrium-api/src/com/atproto/admin/get_account_info.rs
index b69aa067..ec16f2ea 100644
--- a/atrium-api/src/com/atproto/admin/get_account_info.rs
+++ b/atrium-api/src/com/atproto/admin/get_account_info.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.getAccountInfo` namespace.
+pub const NSID: &str = "com.atproto.admin.getAccountInfo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/admin/get_account_infos.rs b/atrium-api/src/com/atproto/admin/get_account_infos.rs
index 465380fb..b6116082 100644
--- a/atrium-api/src/com/atproto/admin/get_account_infos.rs
+++ b/atrium-api/src/com/atproto/admin/get_account_infos.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.getAccountInfos` namespace.
+pub const NSID: &str = "com.atproto.admin.getAccountInfos";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/admin/get_invite_codes.rs b/atrium-api/src/com/atproto/admin/get_invite_codes.rs
index 933a0288..08f744e2 100644
--- a/atrium-api/src/com/atproto/admin/get_invite_codes.rs
+++ b/atrium-api/src/com/atproto/admin/get_invite_codes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.getInviteCodes` namespace.
+pub const NSID: &str = "com.atproto.admin.getInviteCodes";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/admin/get_subject_status.rs b/atrium-api/src/com/atproto/admin/get_subject_status.rs
index 68a11261..feb9d31d 100644
--- a/atrium-api/src/com/atproto/admin/get_subject_status.rs
+++ b/atrium-api/src/com/atproto/admin/get_subject_status.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.getSubjectStatus` namespace.
+pub const NSID: &str = "com.atproto.admin.getSubjectStatus";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/admin/send_email.rs b/atrium-api/src/com/atproto/admin/send_email.rs
index 879256ce..253412d5 100644
--- a/atrium-api/src/com/atproto/admin/send_email.rs
+++ b/atrium-api/src/com/atproto/admin/send_email.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.sendEmail` namespace.
+pub const NSID: &str = "com.atproto.admin.sendEmail";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/admin/update_account_email.rs b/atrium-api/src/com/atproto/admin/update_account_email.rs
index d3eee07e..a70d1c81 100644
--- a/atrium-api/src/com/atproto/admin/update_account_email.rs
+++ b/atrium-api/src/com/atproto/admin/update_account_email.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.updateAccountEmail` namespace.
+pub const NSID: &str = "com.atproto.admin.updateAccountEmail";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/admin/update_account_handle.rs b/atrium-api/src/com/atproto/admin/update_account_handle.rs
index 69aa3fbb..8e20e390 100644
--- a/atrium-api/src/com/atproto/admin/update_account_handle.rs
+++ b/atrium-api/src/com/atproto/admin/update_account_handle.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.updateAccountHandle` namespace.
+pub const NSID: &str = "com.atproto.admin.updateAccountHandle";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/admin/update_account_password.rs b/atrium-api/src/com/atproto/admin/update_account_password.rs
index 3280ad40..81859706 100644
--- a/atrium-api/src/com/atproto/admin/update_account_password.rs
+++ b/atrium-api/src/com/atproto/admin/update_account_password.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.updateAccountPassword` namespace.
+pub const NSID: &str = "com.atproto.admin.updateAccountPassword";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/admin/update_subject_status.rs b/atrium-api/src/com/atproto/admin/update_subject_status.rs
index 9dd19bc9..3a3184d0 100644
--- a/atrium-api/src/com/atproto/admin/update_subject_status.rs
+++ b/atrium-api/src/com/atproto/admin/update_subject_status.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.admin.updateSubjectStatus` namespace.
+pub const NSID: &str = "com.atproto.admin.updateSubjectStatus";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/identity/get_recommended_did_credentials.rs b/atrium-api/src/com/atproto/identity/get_recommended_did_credentials.rs
index 5099a97e..8cd9cb51 100644
--- a/atrium-api/src/com/atproto/identity/get_recommended_did_credentials.rs
+++ b/atrium-api/src/com/atproto/identity/get_recommended_did_credentials.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.identity.getRecommendedDidCredentials` namespace.
+pub const NSID: &str = "com.atproto.identity.getRecommendedDidCredentials";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/identity/request_plc_operation_signature.rs b/atrium-api/src/com/atproto/identity/request_plc_operation_signature.rs
index 3436cc81..5d10c1a8 100644
--- a/atrium-api/src/com/atproto/identity/request_plc_operation_signature.rs
+++ b/atrium-api/src/com/atproto/identity/request_plc_operation_signature.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.identity.requestPlcOperationSignature` namespace.
+pub const NSID: &str = "com.atproto.identity.requestPlcOperationSignature";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(tag = "error", content = "message")]
 pub enum Error {}
diff --git a/atrium-api/src/com/atproto/identity/resolve_handle.rs b/atrium-api/src/com/atproto/identity/resolve_handle.rs
index 7202c1b4..6aa6785e 100644
--- a/atrium-api/src/com/atproto/identity/resolve_handle.rs
+++ b/atrium-api/src/com/atproto/identity/resolve_handle.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.identity.resolveHandle` namespace.
+pub const NSID: &str = "com.atproto.identity.resolveHandle";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/identity/sign_plc_operation.rs b/atrium-api/src/com/atproto/identity/sign_plc_operation.rs
index 4eb0a69d..d789e768 100644
--- a/atrium-api/src/com/atproto/identity/sign_plc_operation.rs
+++ b/atrium-api/src/com/atproto/identity/sign_plc_operation.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.identity.signPlcOperation` namespace.
+pub const NSID: &str = "com.atproto.identity.signPlcOperation";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/identity/submit_plc_operation.rs b/atrium-api/src/com/atproto/identity/submit_plc_operation.rs
index 1246cd84..5d57b310 100644
--- a/atrium-api/src/com/atproto/identity/submit_plc_operation.rs
+++ b/atrium-api/src/com/atproto/identity/submit_plc_operation.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.identity.submitPlcOperation` namespace.
+pub const NSID: &str = "com.atproto.identity.submitPlcOperation";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/identity/update_handle.rs b/atrium-api/src/com/atproto/identity/update_handle.rs
index 6ea24a80..6d351592 100644
--- a/atrium-api/src/com/atproto/identity/update_handle.rs
+++ b/atrium-api/src/com/atproto/identity/update_handle.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.identity.updateHandle` namespace.
+pub const NSID: &str = "com.atproto.identity.updateHandle";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/label/query_labels.rs b/atrium-api/src/com/atproto/label/query_labels.rs
index 22b01f2b..9485778a 100644
--- a/atrium-api/src/com/atproto/label/query_labels.rs
+++ b/atrium-api/src/com/atproto/label/query_labels.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.label.queryLabels` namespace.
+pub const NSID: &str = "com.atproto.label.queryLabels";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/moderation/create_report.rs b/atrium-api/src/com/atproto/moderation/create_report.rs
index 80623918..e1be5a38 100644
--- a/atrium-api/src/com/atproto/moderation/create_report.rs
+++ b/atrium-api/src/com/atproto/moderation/create_report.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.moderation.createReport` namespace.
+pub const NSID: &str = "com.atproto.moderation.createReport";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/repo/apply_writes.rs b/atrium-api/src/com/atproto/repo/apply_writes.rs
index aa982d66..79c5f9bb 100644
--- a/atrium-api/src/com/atproto/repo/apply_writes.rs
+++ b/atrium-api/src/com/atproto/repo/apply_writes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.applyWrites` namespace.
+pub const NSID: &str = "com.atproto.repo.applyWrites";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/repo/create_record.rs b/atrium-api/src/com/atproto/repo/create_record.rs
index fc874c40..36de794b 100644
--- a/atrium-api/src/com/atproto/repo/create_record.rs
+++ b/atrium-api/src/com/atproto/repo/create_record.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.createRecord` namespace.
+pub const NSID: &str = "com.atproto.repo.createRecord";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/repo/delete_record.rs b/atrium-api/src/com/atproto/repo/delete_record.rs
index 499f401e..7eafe296 100644
--- a/atrium-api/src/com/atproto/repo/delete_record.rs
+++ b/atrium-api/src/com/atproto/repo/delete_record.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.deleteRecord` namespace.
+pub const NSID: &str = "com.atproto.repo.deleteRecord";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/repo/describe_repo.rs b/atrium-api/src/com/atproto/repo/describe_repo.rs
index 609d3f62..ffb2451d 100644
--- a/atrium-api/src/com/atproto/repo/describe_repo.rs
+++ b/atrium-api/src/com/atproto/repo/describe_repo.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.describeRepo` namespace.
+pub const NSID: &str = "com.atproto.repo.describeRepo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/repo/get_record.rs b/atrium-api/src/com/atproto/repo/get_record.rs
index 6c6e1f45..0565c76e 100644
--- a/atrium-api/src/com/atproto/repo/get_record.rs
+++ b/atrium-api/src/com/atproto/repo/get_record.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.getRecord` namespace.
+pub const NSID: &str = "com.atproto.repo.getRecord";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/repo/import_repo.rs b/atrium-api/src/com/atproto/repo/import_repo.rs
index 84fdc755..be99ab0a 100644
--- a/atrium-api/src/com/atproto/repo/import_repo.rs
+++ b/atrium-api/src/com/atproto/repo/import_repo.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.importRepo` namespace.
+pub const NSID: &str = "com.atproto.repo.importRepo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(tag = "error", content = "message")]
 pub enum Error {}
diff --git a/atrium-api/src/com/atproto/repo/list_missing_blobs.rs b/atrium-api/src/com/atproto/repo/list_missing_blobs.rs
index b347482f..bad7fcd1 100644
--- a/atrium-api/src/com/atproto/repo/list_missing_blobs.rs
+++ b/atrium-api/src/com/atproto/repo/list_missing_blobs.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.listMissingBlobs` namespace.
+pub const NSID: &str = "com.atproto.repo.listMissingBlobs";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/repo/list_records.rs b/atrium-api/src/com/atproto/repo/list_records.rs
index d5a84c54..f41ed437 100644
--- a/atrium-api/src/com/atproto/repo/list_records.rs
+++ b/atrium-api/src/com/atproto/repo/list_records.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.listRecords` namespace.
+pub const NSID: &str = "com.atproto.repo.listRecords";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/repo/put_record.rs b/atrium-api/src/com/atproto/repo/put_record.rs
index 9eaf6738..7d9c9060 100644
--- a/atrium-api/src/com/atproto/repo/put_record.rs
+++ b/atrium-api/src/com/atproto/repo/put_record.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.putRecord` namespace.
+pub const NSID: &str = "com.atproto.repo.putRecord";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/repo/upload_blob.rs b/atrium-api/src/com/atproto/repo/upload_blob.rs
index 820a97cc..f27576a1 100644
--- a/atrium-api/src/com/atproto/repo/upload_blob.rs
+++ b/atrium-api/src/com/atproto/repo/upload_blob.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.repo.uploadBlob` namespace.
+pub const NSID: &str = "com.atproto.repo.uploadBlob";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/server/activate_account.rs b/atrium-api/src/com/atproto/server/activate_account.rs
index 70f74e02..7104e43a 100644
--- a/atrium-api/src/com/atproto/server/activate_account.rs
+++ b/atrium-api/src/com/atproto/server/activate_account.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.activateAccount` namespace.
+pub const NSID: &str = "com.atproto.server.activateAccount";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(tag = "error", content = "message")]
 pub enum Error {}
diff --git a/atrium-api/src/com/atproto/server/check_account_status.rs b/atrium-api/src/com/atproto/server/check_account_status.rs
index 6529908d..1f8787f7 100644
--- a/atrium-api/src/com/atproto/server/check_account_status.rs
+++ b/atrium-api/src/com/atproto/server/check_account_status.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.checkAccountStatus` namespace.
+pub const NSID: &str = "com.atproto.server.checkAccountStatus";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/server/confirm_email.rs b/atrium-api/src/com/atproto/server/confirm_email.rs
index 7a4eab97..ba7fe78f 100644
--- a/atrium-api/src/com/atproto/server/confirm_email.rs
+++ b/atrium-api/src/com/atproto/server/confirm_email.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.confirmEmail` namespace.
+pub const NSID: &str = "com.atproto.server.confirmEmail";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/create_account.rs b/atrium-api/src/com/atproto/server/create_account.rs
index 3ef585df..424fa220 100644
--- a/atrium-api/src/com/atproto/server/create_account.rs
+++ b/atrium-api/src/com/atproto/server/create_account.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.createAccount` namespace.
+pub const NSID: &str = "com.atproto.server.createAccount";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/create_app_password.rs b/atrium-api/src/com/atproto/server/create_app_password.rs
index 7fd2a012..c676fbc6 100644
--- a/atrium-api/src/com/atproto/server/create_app_password.rs
+++ b/atrium-api/src/com/atproto/server/create_app_password.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.createAppPassword` namespace.
+pub const NSID: &str = "com.atproto.server.createAppPassword";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/create_invite_code.rs b/atrium-api/src/com/atproto/server/create_invite_code.rs
index d93038de..2e16584b 100644
--- a/atrium-api/src/com/atproto/server/create_invite_code.rs
+++ b/atrium-api/src/com/atproto/server/create_invite_code.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.createInviteCode` namespace.
+pub const NSID: &str = "com.atproto.server.createInviteCode";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/create_invite_codes.rs b/atrium-api/src/com/atproto/server/create_invite_codes.rs
index f6a2fc2f..bbba52c1 100644
--- a/atrium-api/src/com/atproto/server/create_invite_codes.rs
+++ b/atrium-api/src/com/atproto/server/create_invite_codes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.createInviteCodes` namespace.
+pub const NSID: &str = "com.atproto.server.createInviteCodes";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/create_session.rs b/atrium-api/src/com/atproto/server/create_session.rs
index c41fdba9..9667c82f 100644
--- a/atrium-api/src/com/atproto/server/create_session.rs
+++ b/atrium-api/src/com/atproto/server/create_session.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.createSession` namespace.
+pub const NSID: &str = "com.atproto.server.createSession";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/deactivate_account.rs b/atrium-api/src/com/atproto/server/deactivate_account.rs
index 8f9eb4a8..af7b5a08 100644
--- a/atrium-api/src/com/atproto/server/deactivate_account.rs
+++ b/atrium-api/src/com/atproto/server/deactivate_account.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.deactivateAccount` namespace.
+pub const NSID: &str = "com.atproto.server.deactivateAccount";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/delete_account.rs b/atrium-api/src/com/atproto/server/delete_account.rs
index 27f19982..eaa4e955 100644
--- a/atrium-api/src/com/atproto/server/delete_account.rs
+++ b/atrium-api/src/com/atproto/server/delete_account.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.deleteAccount` namespace.
+pub const NSID: &str = "com.atproto.server.deleteAccount";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/delete_session.rs b/atrium-api/src/com/atproto/server/delete_session.rs
index 153f0986..fdabf822 100644
--- a/atrium-api/src/com/atproto/server/delete_session.rs
+++ b/atrium-api/src/com/atproto/server/delete_session.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.deleteSession` namespace.
+pub const NSID: &str = "com.atproto.server.deleteSession";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(tag = "error", content = "message")]
 pub enum Error {}
diff --git a/atrium-api/src/com/atproto/server/describe_server.rs b/atrium-api/src/com/atproto/server/describe_server.rs
index df2a971d..4d205645 100644
--- a/atrium-api/src/com/atproto/server/describe_server.rs
+++ b/atrium-api/src/com/atproto/server/describe_server.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.describeServer` namespace.
+pub const NSID: &str = "com.atproto.server.describeServer";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/server/get_account_invite_codes.rs b/atrium-api/src/com/atproto/server/get_account_invite_codes.rs
index 5bf28ff4..0443ca84 100644
--- a/atrium-api/src/com/atproto/server/get_account_invite_codes.rs
+++ b/atrium-api/src/com/atproto/server/get_account_invite_codes.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.getAccountInviteCodes` namespace.
+pub const NSID: &str = "com.atproto.server.getAccountInviteCodes";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/server/get_service_auth.rs b/atrium-api/src/com/atproto/server/get_service_auth.rs
index 093ac57f..6bcdb668 100644
--- a/atrium-api/src/com/atproto/server/get_service_auth.rs
+++ b/atrium-api/src/com/atproto/server/get_service_auth.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.getServiceAuth` namespace.
+pub const NSID: &str = "com.atproto.server.getServiceAuth";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/server/get_session.rs b/atrium-api/src/com/atproto/server/get_session.rs
index d5bc76ba..d1453ccd 100644
--- a/atrium-api/src/com/atproto/server/get_session.rs
+++ b/atrium-api/src/com/atproto/server/get_session.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.getSession` namespace.
+pub const NSID: &str = "com.atproto.server.getSession";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/server/list_app_passwords.rs b/atrium-api/src/com/atproto/server/list_app_passwords.rs
index 7a4ad322..139dea6b 100644
--- a/atrium-api/src/com/atproto/server/list_app_passwords.rs
+++ b/atrium-api/src/com/atproto/server/list_app_passwords.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.listAppPasswords` namespace.
+pub const NSID: &str = "com.atproto.server.listAppPasswords";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/server/refresh_session.rs b/atrium-api/src/com/atproto/server/refresh_session.rs
index 7852a44c..ab860377 100644
--- a/atrium-api/src/com/atproto/server/refresh_session.rs
+++ b/atrium-api/src/com/atproto/server/refresh_session.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.refreshSession` namespace.
+pub const NSID: &str = "com.atproto.server.refreshSession";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/server/request_account_delete.rs b/atrium-api/src/com/atproto/server/request_account_delete.rs
index 9665cf66..0b3954b6 100644
--- a/atrium-api/src/com/atproto/server/request_account_delete.rs
+++ b/atrium-api/src/com/atproto/server/request_account_delete.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.requestAccountDelete` namespace.
+pub const NSID: &str = "com.atproto.server.requestAccountDelete";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(tag = "error", content = "message")]
 pub enum Error {}
diff --git a/atrium-api/src/com/atproto/server/request_email_confirmation.rs b/atrium-api/src/com/atproto/server/request_email_confirmation.rs
index 1e18f838..7066095e 100644
--- a/atrium-api/src/com/atproto/server/request_email_confirmation.rs
+++ b/atrium-api/src/com/atproto/server/request_email_confirmation.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.requestEmailConfirmation` namespace.
+pub const NSID: &str = "com.atproto.server.requestEmailConfirmation";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(tag = "error", content = "message")]
 pub enum Error {}
diff --git a/atrium-api/src/com/atproto/server/request_email_update.rs b/atrium-api/src/com/atproto/server/request_email_update.rs
index fe1f1560..1f569e07 100644
--- a/atrium-api/src/com/atproto/server/request_email_update.rs
+++ b/atrium-api/src/com/atproto/server/request_email_update.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.requestEmailUpdate` namespace.
+pub const NSID: &str = "com.atproto.server.requestEmailUpdate";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/server/request_password_reset.rs b/atrium-api/src/com/atproto/server/request_password_reset.rs
index f3380273..661a693b 100644
--- a/atrium-api/src/com/atproto/server/request_password_reset.rs
+++ b/atrium-api/src/com/atproto/server/request_password_reset.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.requestPasswordReset` namespace.
+pub const NSID: &str = "com.atproto.server.requestPasswordReset";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/reserve_signing_key.rs b/atrium-api/src/com/atproto/server/reserve_signing_key.rs
index 54f6dff2..a24787cb 100644
--- a/atrium-api/src/com/atproto/server/reserve_signing_key.rs
+++ b/atrium-api/src/com/atproto/server/reserve_signing_key.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.reserveSigningKey` namespace.
+pub const NSID: &str = "com.atproto.server.reserveSigningKey";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/reset_password.rs b/atrium-api/src/com/atproto/server/reset_password.rs
index d8f9ec6e..6e5784d0 100644
--- a/atrium-api/src/com/atproto/server/reset_password.rs
+++ b/atrium-api/src/com/atproto/server/reset_password.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.resetPassword` namespace.
+pub const NSID: &str = "com.atproto.server.resetPassword";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/revoke_app_password.rs b/atrium-api/src/com/atproto/server/revoke_app_password.rs
index a869727a..4c003a43 100644
--- a/atrium-api/src/com/atproto/server/revoke_app_password.rs
+++ b/atrium-api/src/com/atproto/server/revoke_app_password.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.revokeAppPassword` namespace.
+pub const NSID: &str = "com.atproto.server.revokeAppPassword";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/server/update_email.rs b/atrium-api/src/com/atproto/server/update_email.rs
index a95edf80..966b99f1 100644
--- a/atrium-api/src/com/atproto/server/update_email.rs
+++ b/atrium-api/src/com/atproto/server/update_email.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.server.updateEmail` namespace.
+pub const NSID: &str = "com.atproto.server.updateEmail";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/sync/get_blob.rs b/atrium-api/src/com/atproto/sync/get_blob.rs
index 446727b6..f3d76eb1 100644
--- a/atrium-api/src/com/atproto/sync/get_blob.rs
+++ b/atrium-api/src/com/atproto/sync/get_blob.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.getBlob` namespace.
+pub const NSID: &str = "com.atproto.sync.getBlob";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/sync/get_blocks.rs b/atrium-api/src/com/atproto/sync/get_blocks.rs
index 79507e89..a79a63bc 100644
--- a/atrium-api/src/com/atproto/sync/get_blocks.rs
+++ b/atrium-api/src/com/atproto/sync/get_blocks.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.getBlocks` namespace.
+pub const NSID: &str = "com.atproto.sync.getBlocks";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/sync/get_checkout.rs b/atrium-api/src/com/atproto/sync/get_checkout.rs
index d0db08ac..a15c3b00 100644
--- a/atrium-api/src/com/atproto/sync/get_checkout.rs
+++ b/atrium-api/src/com/atproto/sync/get_checkout.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.getCheckout` namespace.
+pub const NSID: &str = "com.atproto.sync.getCheckout";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/sync/get_head.rs b/atrium-api/src/com/atproto/sync/get_head.rs
index c449ac15..4a575012 100644
--- a/atrium-api/src/com/atproto/sync/get_head.rs
+++ b/atrium-api/src/com/atproto/sync/get_head.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.getHead` namespace.
+pub const NSID: &str = "com.atproto.sync.getHead";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/sync/get_record.rs b/atrium-api/src/com/atproto/sync/get_record.rs
index c8b2f03b..d92bab2e 100644
--- a/atrium-api/src/com/atproto/sync/get_record.rs
+++ b/atrium-api/src/com/atproto/sync/get_record.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.getRecord` namespace.
+pub const NSID: &str = "com.atproto.sync.getRecord";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/sync/get_repo.rs b/atrium-api/src/com/atproto/sync/get_repo.rs
index 6e2431bf..34b54dd2 100644
--- a/atrium-api/src/com/atproto/sync/get_repo.rs
+++ b/atrium-api/src/com/atproto/sync/get_repo.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.getRepo` namespace.
+pub const NSID: &str = "com.atproto.sync.getRepo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/sync/list_blobs.rs b/atrium-api/src/com/atproto/sync/list_blobs.rs
index 1d85f8c2..e4ae49ed 100644
--- a/atrium-api/src/com/atproto/sync/list_blobs.rs
+++ b/atrium-api/src/com/atproto/sync/list_blobs.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.listBlobs` namespace.
+pub const NSID: &str = "com.atproto.sync.listBlobs";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/sync/list_repos.rs b/atrium-api/src/com/atproto/sync/list_repos.rs
index bc545b96..39914d7e 100644
--- a/atrium-api/src/com/atproto/sync/list_repos.rs
+++ b/atrium-api/src/com/atproto/sync/list_repos.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.listRepos` namespace.
+pub const NSID: &str = "com.atproto.sync.listRepos";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/sync/notify_of_update.rs b/atrium-api/src/com/atproto/sync/notify_of_update.rs
index 05f1aeab..f046b12d 100644
--- a/atrium-api/src/com/atproto/sync/notify_of_update.rs
+++ b/atrium-api/src/com/atproto/sync/notify_of_update.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.notifyOfUpdate` namespace.
+pub const NSID: &str = "com.atproto.sync.notifyOfUpdate";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/sync/request_crawl.rs b/atrium-api/src/com/atproto/sync/request_crawl.rs
index 71bb5ab5..bd33a06f 100644
--- a/atrium-api/src/com/atproto/sync/request_crawl.rs
+++ b/atrium-api/src/com/atproto/sync/request_crawl.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.requestCrawl` namespace.
+pub const NSID: &str = "com.atproto.sync.requestCrawl";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/com/atproto/temp/check_signup_queue.rs b/atrium-api/src/com/atproto/temp/check_signup_queue.rs
index 35cf48ef..7cd8f5a8 100644
--- a/atrium-api/src/com/atproto/temp/check_signup_queue.rs
+++ b/atrium-api/src/com/atproto/temp/check_signup_queue.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.temp.checkSignupQueue` namespace.
+pub const NSID: &str = "com.atproto.temp.checkSignupQueue";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/com/atproto/temp/fetch_labels.rs b/atrium-api/src/com/atproto/temp/fetch_labels.rs
index 63ea92e6..2dd2e465 100644
--- a/atrium-api/src/com/atproto/temp/fetch_labels.rs
+++ b/atrium-api/src/com/atproto/temp/fetch_labels.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.temp.fetchLabels` namespace.
+pub const NSID: &str = "com.atproto.temp.fetchLabels";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/com/atproto/temp/request_phone_verification.rs b/atrium-api/src/com/atproto/temp/request_phone_verification.rs
index e26b9371..89b54c5d 100644
--- a/atrium-api/src/com/atproto/temp/request_phone_verification.rs
+++ b/atrium-api/src/com/atproto/temp/request_phone_verification.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.temp.requestPhoneVerification` namespace.
+pub const NSID: &str = "com.atproto.temp.requestPhoneVerification";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/tools/ozone/communication/create_template.rs b/atrium-api/src/tools/ozone/communication/create_template.rs
index 7d0161e3..9a85d8d4 100644
--- a/atrium-api/src/tools/ozone/communication/create_template.rs
+++ b/atrium-api/src/tools/ozone/communication/create_template.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.communication.createTemplate` namespace.
+pub const NSID: &str = "tools.ozone.communication.createTemplate";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/tools/ozone/communication/delete_template.rs b/atrium-api/src/tools/ozone/communication/delete_template.rs
index 4421ed74..871577d4 100644
--- a/atrium-api/src/tools/ozone/communication/delete_template.rs
+++ b/atrium-api/src/tools/ozone/communication/delete_template.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.communication.deleteTemplate` namespace.
+pub const NSID: &str = "tools.ozone.communication.deleteTemplate";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/tools/ozone/communication/list_templates.rs b/atrium-api/src/tools/ozone/communication/list_templates.rs
index 65e72596..62555439 100644
--- a/atrium-api/src/tools/ozone/communication/list_templates.rs
+++ b/atrium-api/src/tools/ozone/communication/list_templates.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.communication.listTemplates` namespace.
+pub const NSID: &str = "tools.ozone.communication.listTemplates";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Output {
diff --git a/atrium-api/src/tools/ozone/communication/update_template.rs b/atrium-api/src/tools/ozone/communication/update_template.rs
index 67a4cb39..aed5022c 100644
--- a/atrium-api/src/tools/ozone/communication/update_template.rs
+++ b/atrium-api/src/tools/ozone/communication/update_template.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.communication.updateTemplate` namespace.
+pub const NSID: &str = "tools.ozone.communication.updateTemplate";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/tools/ozone/moderation/emit_event.rs b/atrium-api/src/tools/ozone/moderation/emit_event.rs
index 78b9faf9..ac6e17d8 100644
--- a/atrium-api/src/tools/ozone/moderation/emit_event.rs
+++ b/atrium-api/src/tools/ozone/moderation/emit_event.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.moderation.emitEvent` namespace.
+pub const NSID: &str = "tools.ozone.moderation.emitEvent";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Input {
diff --git a/atrium-api/src/tools/ozone/moderation/get_event.rs b/atrium-api/src/tools/ozone/moderation/get_event.rs
index e668b308..32fe4ff9 100644
--- a/atrium-api/src/tools/ozone/moderation/get_event.rs
+++ b/atrium-api/src/tools/ozone/moderation/get_event.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.moderation.getEvent` namespace.
+pub const NSID: &str = "tools.ozone.moderation.getEvent";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/tools/ozone/moderation/get_record.rs b/atrium-api/src/tools/ozone/moderation/get_record.rs
index de5de486..1b6083fc 100644
--- a/atrium-api/src/tools/ozone/moderation/get_record.rs
+++ b/atrium-api/src/tools/ozone/moderation/get_record.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.moderation.getRecord` namespace.
+pub const NSID: &str = "tools.ozone.moderation.getRecord";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/tools/ozone/moderation/get_repo.rs b/atrium-api/src/tools/ozone/moderation/get_repo.rs
index fd49ab8b..0d0e6b92 100644
--- a/atrium-api/src/tools/ozone/moderation/get_repo.rs
+++ b/atrium-api/src/tools/ozone/moderation/get_repo.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.moderation.getRepo` namespace.
+pub const NSID: &str = "tools.ozone.moderation.getRepo";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/tools/ozone/moderation/query_events.rs b/atrium-api/src/tools/ozone/moderation/query_events.rs
index b75f590a..02dca69f 100644
--- a/atrium-api/src/tools/ozone/moderation/query_events.rs
+++ b/atrium-api/src/tools/ozone/moderation/query_events.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.moderation.queryEvents` namespace.
+pub const NSID: &str = "tools.ozone.moderation.queryEvents";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/tools/ozone/moderation/query_statuses.rs b/atrium-api/src/tools/ozone/moderation/query_statuses.rs
index 54232315..864e605c 100644
--- a/atrium-api/src/tools/ozone/moderation/query_statuses.rs
+++ b/atrium-api/src/tools/ozone/moderation/query_statuses.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.moderation.queryStatuses` namespace.
+pub const NSID: &str = "tools.ozone.moderation.queryStatuses";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-api/src/tools/ozone/moderation/search_repos.rs b/atrium-api/src/tools/ozone/moderation/search_repos.rs
index 56a070f8..3102ecc7 100644
--- a/atrium-api/src/tools/ozone/moderation/search_repos.rs
+++ b/atrium-api/src/tools/ozone/moderation/search_repos.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `tools.ozone.moderation.searchRepos` namespace.
+pub const NSID: &str = "tools.ozone.moderation.searchRepos";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-xrpc-client/src/isahc.rs b/atrium-xrpc-client/src/isahc.rs
index d29dfceb..0f6492b8 100644
--- a/atrium-xrpc-client/src/isahc.rs
+++ b/atrium-xrpc-client/src/isahc.rs
@@ -14,6 +14,7 @@ use std::sync::Arc;
 /// because it already uses an [`Arc`] internally.
 ///
 /// [`Rc`]: std::rc::Rc
+#[derive(Clone)]
 pub struct IsahcClient {
     base_uri: String,
     client: Arc<Client>,
diff --git a/atrium-xrpc-client/src/reqwest.rs b/atrium-xrpc-client/src/reqwest.rs
index f251d423..94195679 100644
--- a/atrium-xrpc-client/src/reqwest.rs
+++ b/atrium-xrpc-client/src/reqwest.rs
@@ -14,6 +14,7 @@ use std::sync::Arc;
 /// because it already uses an [`Arc`] internally.
 ///
 /// [`Rc`]: std::rc::Rc
+#[derive(Clone)]
 pub struct ReqwestClient {
     base_uri: String,
     client: Arc<Client>,
diff --git a/atrium-xrpc/src/lib.rs b/atrium-xrpc/src/lib.rs
index 654dbc9c..bbc169c9 100644
--- a/atrium-xrpc/src/lib.rs
+++ b/atrium-xrpc/src/lib.rs
@@ -1,7 +1,7 @@
 #![doc = include_str!("../README.md")]
 pub mod error;
 mod traits;
-mod types;
+pub mod types;
 
 pub use crate::error::{Error, Result};
 pub use crate::traits::{HttpClient, XrpcClient};
@@ -57,7 +57,7 @@ mod tests {
             let response = xrpc
                 .send_xrpc::<_, (), _, _>(&XrpcRequest {
                     method: http::Method::GET,
-                    path: "example".into(),
+                    nsid: "example".into(),
                     parameters: Some(params),
                     input: None,
                     encoding: None,
@@ -200,7 +200,7 @@ mod tests {
                 let response = xrpc
                     .send_xrpc::<_, (), (), _>(&XrpcRequest {
                         method: http::Method::GET,
-                        path: "example".into(),
+                        nsid: "example".into(),
                         parameters: Some(params),
                         input: None,
                         encoding: None,
@@ -279,7 +279,7 @@ mod tests {
                 let response = xrpc
                     .send_xrpc::<(), _, (), _>(&XrpcRequest {
                         method: http::Method::POST,
-                        path: "example".into(),
+                        nsid: "example".into(),
                         parameters: None,
                         input: Some(InputDataOrBytes::Data(input)),
                         encoding: None,
@@ -341,7 +341,7 @@ mod tests {
                 let response = xrpc
                     .send_xrpc::<(), Vec<u8>, _, _>(&XrpcRequest {
                         method: http::Method::POST,
-                        path: "example".into(),
+                        nsid: "example".into(),
                         parameters: None,
                         input: Some(InputDataOrBytes::Bytes(input)),
                         encoding: None,
diff --git a/atrium-xrpc/src/traits.rs b/atrium-xrpc/src/traits.rs
index d8e19589..de5ccc1c 100644
--- a/atrium-xrpc/src/traits.rs
+++ b/atrium-xrpc/src/traits.rs
@@ -1,6 +1,7 @@
 use crate::error::Error;
 use crate::error::{XrpcError, XrpcErrorKind};
-use crate::types::{InputDataOrBytes, OutputDataOrBytes, XrpcRequest};
+use crate::types::{Header, NSID_REFRESH_SESSION};
+use crate::{InputDataOrBytes, OutputDataOrBytes, XrpcRequest};
 use async_trait::async_trait;
 use http::{Method, Request, Response};
 use serde::{de::DeserializeOwned, Serialize};
@@ -9,6 +10,7 @@ use serde::{de::DeserializeOwned, Serialize};
 #[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
 #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
 pub trait HttpClient {
+    /// Send an HTTP request and return the response.
     async fn send_http(
         &self,
         request: Request<Vec<u8>>,
@@ -24,14 +26,22 @@ type XrpcResult<O, E> = core::result::Result<OutputDataOrBytes<O>, self::Error<E
 #[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
 #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
 pub trait XrpcClient: HttpClient {
+    /// The base URI of the XRPC server.
     fn base_uri(&self) -> String;
+    /// Get the authentication token to use `Authorization` header.
     #[allow(unused_variables)]
-    async fn auth(&self, is_refresh: bool) -> Option<String> {
+    async fn authentication_token(&self, is_refresh: bool) -> Option<String> {
         None
     }
-    async fn headers(&self) -> Vec<(String, String)> {
-        Vec::new()
+    /// Get the `atproto-proxy` header.
+    async fn atproto_proxy_header(&self) -> Option<String> {
+        None
+    }
+    /// Get the `atproto-accept-labelers` header.
+    async fn atproto_accept_labelers_header(&self) -> Option<Vec<String>> {
+        None
     }
+    /// Send an XRPC request and return the response.
     async fn send_xrpc<P, I, O, E>(&self, request: &XrpcRequest<P, I>) -> XrpcResult<O, E>
     where
         P: Serialize + Send + Sync,
@@ -39,7 +49,8 @@ pub trait XrpcClient: HttpClient {
         O: DeserializeOwned + Send + Sync,
         E: DeserializeOwned + Send + Sync,
     {
-        let mut uri = format!("{}/xrpc/{}", self.base_uri(), request.path);
+        let mut uri = format!("{}/xrpc/{}", self.base_uri(), request.nsid);
+        // Query parameters
         if let Some(p) = &request.parameters {
             serde_html_form::to_string(p).map(|qs| {
                 uri += "?";
@@ -47,21 +58,25 @@ pub trait XrpcClient: HttpClient {
             })?;
         };
         let mut builder = Request::builder().method(&request.method).uri(&uri);
+        // Headers
         if let Some(encoding) = &request.encoding {
-            builder = builder.header(http::header::CONTENT_TYPE, encoding);
+            builder = builder.header(Header::ContentType, encoding);
         }
         if let Some(token) = self
-            .auth(
-                request.method == Method::POST
-                    && request.path == "com.atproto.server.refreshSession",
+            .authentication_token(
+                request.method == Method::POST && request.nsid == NSID_REFRESH_SESSION,
             )
             .await
         {
-            builder = builder.header(http::header::AUTHORIZATION, format!("Bearer {}", token));
+            builder = builder.header(Header::Authorization, format!("Bearer {}", token));
+        }
+        if let Some(proxy) = self.atproto_proxy_header().await {
+            builder = builder.header(Header::AtprotoProxy, proxy);
         }
-        for (key, value) in self.headers().await {
-            builder = builder.header(key, value);
+        if let Some(accept_labelers) = self.atproto_accept_labelers_header().await {
+            builder = builder.header(Header::AtprotoAcceptLabelers, accept_labelers.join(", "));
         }
+        // Body
         let body = if let Some(input) = &request.input {
             match input {
                 InputDataOrBytes::Data(data) => serde_json::to_vec(&data)?,
@@ -70,6 +85,7 @@ pub trait XrpcClient: HttpClient {
         } else {
             Vec::new()
         };
+        // Send
         let (parts, body) = self
             .send_http(builder.body(body)?)
             .await
diff --git a/atrium-xrpc/src/types.rs b/atrium-xrpc/src/types.rs
index f9a95945..0fb23863 100644
--- a/atrium-xrpc/src/types.rs
+++ b/atrium-xrpc/src/types.rs
@@ -1,6 +1,40 @@
-use http::Method;
+use http::header::{AUTHORIZATION, CONTENT_TYPE};
+use http::{HeaderName, Method};
 use serde::{de::DeserializeOwned, Serialize};
 
+pub(crate) const NSID_REFRESH_SESSION: &str = "com.atproto.server.refreshSession";
+
+/// HTTP headers which can be used in XPRC requests.
+pub enum Header {
+    ContentType,
+    Authorization,
+    AtprotoProxy,
+    AtprotoAcceptLabelers,
+}
+
+impl From<Header> for HeaderName {
+    fn from(value: Header) -> Self {
+        match value {
+            Header::ContentType => CONTENT_TYPE,
+            Header::Authorization => AUTHORIZATION,
+            Header::AtprotoProxy => HeaderName::from_static("atproto-proxy"),
+            Header::AtprotoAcceptLabelers => HeaderName::from_static("atproto-accept-labelers"),
+        }
+    }
+}
+
+/// A request which can be executed with [`XrpcClient::send_xrpc()`](crate::XrpcClient::send_xrpc).
+pub struct XrpcRequest<P, I>
+where
+    I: Serialize,
+{
+    pub method: Method,
+    pub nsid: String,
+    pub parameters: Option<P>,
+    pub input: Option<InputDataOrBytes<I>>,
+    pub encoding: Option<String>,
+}
+
 /// A type which can be used as a parameter of [`XrpcRequest`].
 ///
 /// JSON serializable data or raw bytes.
@@ -22,15 +56,3 @@ where
     Data(T),
     Bytes(Vec<u8>),
 }
-
-/// A request which can be executed with [`XrpcClient::send_xrpc()`](crate::XrpcClient::send_xrpc).
-pub struct XrpcRequest<P, I>
-where
-    I: Serialize,
-{
-    pub method: Method,
-    pub path: String,
-    pub parameters: Option<P>,
-    pub input: Option<InputDataOrBytes<I>>,
-    pub encoding: Option<String>,
-}
diff --git a/lexicon/atrium-codegen/src/generator.rs b/lexicon/atrium-codegen/src/generator.rs
index 9b4afa6c..376309f7 100644
--- a/lexicon/atrium-codegen/src/generator.rs
+++ b/lexicon/atrium-codegen/src/generator.rs
@@ -25,8 +25,13 @@ pub(crate) fn generate_schemas(
         let mut tokens = Vec::new();
         let mut names = Vec::new();
         for (name, def) in &schema.defs {
-            // NSID (for XrpcSubscription only)
-            if let LexUserType::XrpcSubscription(_) = &def {
+            // NSID (for XRPC Query, Procedure, Subscription)
+            if matches!(
+                def,
+                LexUserType::XrpcQuery(_)
+                    | LexUserType::XrpcProcedure(_)
+                    | LexUserType::XrpcSubscription(_)
+            ) {
                 let nsid = schema.id.clone();
                 tokens.push(quote! {
                     pub const NSID: &str = #nsid;
diff --git a/lexicon/atrium-codegen/src/token_stream.rs b/lexicon/atrium-codegen/src/token_stream.rs
index 8b85fe47..5d285aec 100644
--- a/lexicon/atrium-codegen/src/token_stream.rs
+++ b/lexicon/atrium-codegen/src/token_stream.rs
@@ -595,8 +595,7 @@ pub fn record_enum(
     let enum_name = format_ident!("{name}");
     let mut variants = Vec::new();
     for r#ref in refs {
-        let default = if is_record { "record" } else { "main" };
-        let path = resolve_path(r#ref, default)?;
+        let path = resolve_path(r#ref, if is_record { "record" } else { "main" })?;
         let rename = if r#ref.starts_with('#') {
             format!(
                 "{}{}",
@@ -880,10 +879,11 @@ fn xrpc_impl_query(query: &LexXrpcQuery, nsid: &str) -> Result<TokenStream> {
     } else {
         quote!(None)
     };
+    let nsid_path = resolve_path(nsid, "NSID")?;
     let xrpc_call = quote! {
         self.xrpc.send_xrpc::<#(#generic_args),*>(&atrium_xrpc::XrpcRequest {
             method: http::Method::GET,
-            path: #nsid.into(),
+            nsid: #nsid_path.into(),
             parameters: #param_value,
             input: None,
             encoding: None,
@@ -946,10 +946,11 @@ fn xrpc_impl_procedure(procedure: &LexXrpcProcedure, nsid: &str) -> Result<Token
     } else {
         quote!(None)
     };
+    let nsid_path = resolve_path(nsid, "NSID")?;
     let xrpc_call = quote! {
         self.xrpc.send_xrpc::<#(#generic_args),*>(&atrium_xrpc::XrpcRequest {
             method: http::Method::POST,
-            path: #nsid.into(),
+            nsid: #nsid_path.into(),
             parameters: None,
             input: #input_value,
             encoding: #encoding,
@@ -1040,7 +1041,11 @@ fn resolve_path(r#ref: &str, default: &str) -> Result<TokenStream> {
         format!(
             "crate::{}::{}",
             namespace.split('.').map(str::to_snake_case).join("::"),
-            def.to_pascal_case()
+            if def.chars().all(char::is_uppercase) {
+                def.to_string()
+            } else {
+                def.to_pascal_case()
+            }
         )
     })?;
     Ok(quote!(#path))


Test patch:
diff --git a/atrium-api/src/com/atproto/sync/get_latest_commit.rs b/atrium-api/src/com/atproto/sync/get_latest_commit.rs
index 19c69cd0..fb32d897 100644
--- a/atrium-api/src/com/atproto/sync/get_latest_commit.rs
+++ b/atrium-api/src/com/atproto/sync/get_latest_commit.rs
@@ -1,5 +1,6 @@
 // This file is generated by atrium-codegen. DO NOT EDIT.
 //!Definitions for the `com.atproto.sync.getLatestCommit` namespace.
+pub const NSID: &str = "com.atproto.sync.getLatestCommit";
 #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)]
 #[serde(rename_all = "camelCase")]
 pub struct Parameters {
diff --git a/atrium-xrpc-client/src/tests.rs b/atrium-xrpc-client/src/tests.rs
index 4c8d9e36..5c9a9790 100644
--- a/atrium-xrpc-client/src/tests.rs
+++ b/atrium-xrpc-client/src/tests.rs
@@ -33,7 +33,7 @@ async fn run_query(
     let response = client
         .send_xrpc::<_, (), _, _>(&XrpcRequest {
             method: Method::GET,
-            path,
+            nsid: path,
             parameters: Some(Parameters {
                 query: "foo".into(),
             }),
@@ -54,7 +54,7 @@ async fn run_procedure(
     let response = client
         .send_xrpc::<(), _, _, _>(&XrpcRequest {
             method: Method::POST,
-            path,
+            nsid: path,
             parameters: None,
             input: Some(InputDataOrBytes::Data(Input { data: "foo".into() })),
             encoding: Some("application/json".into()),