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,9 +1,11 @@
 use crate::{
-  handle_string_result_as_callback, Error, CODE_VERSION, DEVICE_TYPE,
-  IDENTITY_SOCKET_ADDR, RUNTIME,
+  handle_string_result_as_callback, handle_void_result_as_callback, Error,
+  CODE_VERSION, DEVICE_TYPE, IDENTITY_SOCKET_ADDR, RUNTIME,
 };
 use grpc_clients::identity::{
-  get_unauthenticated_client, protos::unauth::GetFarcasterUsersRequest,
+  get_auth_client, get_unauthenticated_client,
+  protos::auth::LinkFarcasterAccountRequest,
+  protos::unauth::GetFarcasterUsersRequest,
 };
 use serde::Serialize;
 
@@ -61,3 +63,48 @@
 
   Ok(serde_json::to_string(&mapped_response)?)
 }
+
+pub fn link_farcaster_account(
+  user_id: String,
+  device_id: String,
+  access_token: String,
+  farcaster_id: String,
+  promise_id: u32,
+) {
+  RUNTIME.spawn(async move {
+    let result = link_farcaster_account_helper(
+      user_id,
+      device_id,
+      access_token,
+      farcaster_id,
+    )
+    .await;
+    handle_void_result_as_callback(result, promise_id);
+  });
+}
+
+async fn link_farcaster_account_helper(
+  user_id: String,
+  device_id: String,
+  access_token: String,
+  farcaster_id: String,
+) -> Result<(), Error> {
+  let mut identity_client = get_auth_client(
+    IDENTITY_SOCKET_ADDR,
+    user_id,
+    device_id,
+    access_token,
+    CODE_VERSION,
+    DEVICE_TYPE.as_str_name().to_lowercase(),
+  )
+  .await?;
+
+  let link_farcaster_account_request =
+    LinkFarcasterAccountRequest { farcaster_id };
+
+  identity_client
+    .link_farcaster_account(link_farcaster_account_request)
+    .await?;
+
+  Ok(())
+}
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,9 @@
 use exact_user_search::{
   find_user_id_for_username, find_user_id_for_wallet_address,
 };
-use farcaster::{farcaster_id_string_to_option, get_farcaster_users};
+use farcaster::{
+  farcaster_id_string_to_option, get_farcaster_users, link_farcaster_account,
+};
 use ffi::{bool_callback, string_callback, void_callback};
 use future_manager::ffi::*;
 use grpc_clients::identity::protos::auth::{
@@ -247,6 +249,15 @@
     #[cxx_name = "identityGetFarcasterUsers"]
     fn get_farcaster_users(farcaster_ids: Vec<String>, promise_id: u32);
 
+    #[cxx_name = "identityLinkFarcasterAccount"]
+    fn link_farcaster_account(
+      user_id: String,
+      device_id: String,
+      access_token: String,
+      farcaster_id: String,
+      promise_id: u32,
+    );
+
     // Argon2
     #[cxx_name = "compute_backup_key"]
     fn compute_backup_key_str(