diff --git a/native/native_rust_library/src/farcaster.rs b/native/native_rust_library/src/farcaster.rs
--- a/native/native_rust_library/src/farcaster.rs
+++ b/native/native_rust_library/src/farcaster.rs
@@ -1,3 +1,22 @@
+use crate::{
+  handle_string_result_as_callback, Error, CODE_VERSION, DEVICE_TYPE,
+  IDENTITY_SOCKET_ADDR, RUNTIME,
+};
+use grpc_clients::identity::{
+  get_unauthenticated_client, protos::unauth::GetFarcasterUsersRequest,
+};
+use serde::Serialize;
+
+#[derive(Serialize)]
+#[serde(rename_all = "camelCase")]
+struct FarcasterUser {
+  #[serde(rename = "userID")]
+  user_id: String,
+  username: String,
+  #[serde(rename = "farcasterID")]
+  farcaster_id: String,
+}
+
 pub fn farcaster_id_string_to_option(input: &str) -> Option<String> {
   if input.is_empty() {
     None
@@ -5,3 +24,40 @@
     Some(input.to_string())
   }
 }
+
+pub fn get_farcaster_users(farcaster_ids: Vec<String>, promise_id: u32) {
+  RUNTIME.spawn(async move {
+    let result = get_farcaster_users_helper(farcaster_ids).await;
+    handle_string_result_as_callback(result, promise_id);
+  });
+}
+
+async fn get_farcaster_users_helper(
+  farcaster_ids: Vec<String>,
+) -> Result<String, Error> {
+  let get_farcaster_users_request = GetFarcasterUsersRequest { farcaster_ids };
+
+  let mut identity_client = get_unauthenticated_client(
+    IDENTITY_SOCKET_ADDR,
+    CODE_VERSION,
+    DEVICE_TYPE.as_str_name().to_lowercase(),
+  )
+  .await?;
+
+  let response = identity_client
+    .get_farcaster_users(get_farcaster_users_request)
+    .await?
+    .into_inner();
+
+  let mapped_response: Vec<FarcasterUser> = response
+    .farcaster_users
+    .into_iter()
+    .map(|farcaster_user| FarcasterUser {
+      user_id: farcaster_user.user_id,
+      username: farcaster_user.username,
+      farcaster_id: farcaster_user.farcaster_id,
+    })
+    .collect();
+
+  Ok(serde_json::to_string(&mapped_response)?)
+}
diff --git a/native/native_rust_library/src/lib.rs b/native/native_rust_library/src/lib.rs
--- a/native/native_rust_library/src/lib.rs
+++ b/native/native_rust_library/src/lib.rs
@@ -4,7 +4,7 @@
 use exact_user_search::{
   find_user_id_for_username, find_user_id_for_wallet_address,
 };
-use farcaster::farcaster_id_string_to_option;
+use farcaster::{farcaster_id_string_to_option, get_farcaster_users};
 use ffi::{bool_callback, string_callback, void_callback};
 use future_manager::ffi::*;
 use grpc_clients::identity::protos::auth::{
@@ -243,6 +243,10 @@
     #[cxx_name = "identityFindUserIDForUsername"]
     fn find_user_id_for_username(username: String, promise_id: u32);
 
+    // Farcaster
+    #[cxx_name = "identityGetFarcasterUsers"]
+    fn get_farcaster_users(farcaster_ids: Vec<String>, promise_id: u32);
+
     // Argon2
     #[cxx_name = "compute_backup_key"]
     fn compute_backup_key_str(