diff --git a/Frameworks/Bindings.txt b/Frameworks/Bindings.txt
index e77b06d527dadbc6d73073897cc37beb65f704bd..cec1da4111fcd335b53d1e363114a94685800fa8 100644
--- a/Frameworks/Bindings.txt
+++ b/Frameworks/Bindings.txt
@@ -1,4 +1,4 @@
-https://git.xx.network/elixxir/client/-/commit/2deedc730bbe8ff3a0888c666cdb096bdda56663
+https://git.xx.network/elixxir/client/-/commit/12eb14f16d4a786b073364333d5fb7add6aa6fb7
 go version go1.17.13 darwin/arm64
 Xcode 14.0 Build version 14A309
 gomobile bind target: ios,iossimulator,macos
diff --git a/Frameworks/Bindings.xcframework/Info.plist b/Frameworks/Bindings.xcframework/Info.plist
index 43fe32dad94767ae305b61db56f5604f8612617e..e66824e5243985b4ac053ef62aeaaf571fe03970 100644
--- a/Frameworks/Bindings.xcframework/Info.plist
+++ b/Frameworks/Bindings.xcframework/Info.plist
@@ -6,7 +6,7 @@
 	<array>
 		<dict>
 			<key>LibraryIdentifier</key>
-			<string>macos-arm64_x86_64</string>
+			<string>ios-arm64_x86_64-simulator</string>
 			<key>LibraryPath</key>
 			<string>Bindings.framework</string>
 			<key>SupportedArchitectures</key>
@@ -15,34 +15,34 @@
 				<string>x86_64</string>
 			</array>
 			<key>SupportedPlatform</key>
-			<string>macos</string>
+			<string>ios</string>
+			<key>SupportedPlatformVariant</key>
+			<string>simulator</string>
 		</dict>
 		<dict>
 			<key>LibraryIdentifier</key>
-			<string>ios-arm64_x86_64-simulator</string>
+			<string>ios-arm64</string>
 			<key>LibraryPath</key>
 			<string>Bindings.framework</string>
 			<key>SupportedArchitectures</key>
 			<array>
 				<string>arm64</string>
-				<string>x86_64</string>
 			</array>
 			<key>SupportedPlatform</key>
 			<string>ios</string>
-			<key>SupportedPlatformVariant</key>
-			<string>simulator</string>
 		</dict>
 		<dict>
 			<key>LibraryIdentifier</key>
-			<string>ios-arm64</string>
+			<string>macos-arm64_x86_64</string>
 			<key>LibraryPath</key>
 			<string>Bindings.framework</string>
 			<key>SupportedArchitectures</key>
 			<array>
 				<string>arm64</string>
+				<string>x86_64</string>
 			</array>
 			<key>SupportedPlatform</key>
-			<string>ios</string>
+			<string>macos</string>
 		</dict>
 	</array>
 	<key>CFBundlePackageType</key>
diff --git a/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Bindings b/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Bindings
index 028698e78d12ebe96e4ffd2d7e8e5ed848493dc9..3e4de76647083e287fb3285e065272666172135a 100644
Binary files a/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Bindings and b/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Bindings differ
diff --git a/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Headers/Bindings.objc.h b/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Headers/Bindings.objc.h
index 8a469e985c895f732191ca1be50728da7528d8e3..96ddf1d0c47ebdea5dffbb77e053fbdd5e841798 100644
--- a/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Headers/Bindings.objc.h
+++ b/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Headers/Bindings.objc.h
@@ -84,6 +84,8 @@
 @class BindingsTrackServicesCallback;
 @protocol BindingsUdLookupCallback;
 @class BindingsUdLookupCallback;
+@protocol BindingsUdMultiLookupCallback;
+@class BindingsUdMultiLookupCallback;
 @protocol BindingsUdNetworkStatus;
 @class BindingsUdNetworkStatus;
 @protocol BindingsUdSearchCallback;
@@ -208,6 +210,10 @@ Parameters:
 - (void)callback:(NSData* _Nullable)contactBytes err:(NSError* _Nullable)err;
 @end
 
+@protocol BindingsUdMultiLookupCallback <NSObject>
+- (void)callback:(NSData* _Nullable)contactListJSON failedIDs:(NSData* _Nullable)failedIDs err:(NSError* _Nullable)err;
+@end
+
 @protocol BindingsUdNetworkStatus <NSObject>
 /**
  * UdNetworkStatus returns:
@@ -2114,6 +2120,24 @@ Returns:
  */
 FOUNDATION_EXPORT NSData* _Nullable BindingsLookupUD(long e2eID, NSData* _Nullable udContact, id<BindingsUdLookupCallback> _Nullable cb, NSData* _Nullable lookupId, NSData* _Nullable singleRequestParamsJSON, NSError* _Nullable* _Nullable error);
 
+/**
+ * MultiLookupUD returns the public key of all passed in IDs as known by the
+user discovery system or returns by the timeout.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker
+ - udContact - the marshalled bytes of the contact.Contact object
+ - lookupIds - JSON marshalled list of []*id.ID object for the users that
+   MultiLookupUD will look up.
+ - singleRequestParams - the JSON marshalled bytes of single.RequestParams
+
+Returns:
+ - []byte - the JSON marshalled bytes of the SingleUseSendReport object,
+   which can be passed into Cmix.WaitForRoundResult to see if the send
+   succeeded.
+ */
+FOUNDATION_EXPORT BOOL BindingsMultiLookupUD(long e2eID, NSData* _Nullable udContact, id<BindingsUdMultiLookupCallback> _Nullable cb, NSData* _Nullable lookupIds, NSData* _Nullable singleRequestParamsJSON, NSError* _Nullable* _Nullable error);
+
 /**
  * NewBroadcastChannel creates a bindings-layer broadcast channel and starts
 listening for new messages.
@@ -2465,6 +2489,8 @@ FOUNDATION_EXPORT BOOL BindingsUpdateCommonErrors(NSString* _Nullable jsonFile,
 
 @class BindingsUdLookupCallback;
 
+@class BindingsUdMultiLookupCallback;
+
 @class BindingsUdNetworkStatus;
 
 @class BindingsUdSearchCallback;
@@ -2805,6 +2831,31 @@ Parameters:
 - (void)callback:(NSData* _Nullable)contactBytes err:(NSError* _Nullable)err;
 @end
 
+/**
+ * UdMultiLookupCallback contains the callback called by MultiLookupUD that returns the
+contacts which match the passed in IDs.
+
+Parameters:
+ - contactListJSON - the JSON marshalled bytes of []contact.Contact, or nil
+   if an error occurs.
+
+  JSON Example:
+  {
+ 	"<xxc(2)F8dL9EC6gy+RMJuk3R+Au6eGExo02Wfio5cacjBcJRwDEgB7Ugdw/BAr6RkCABkWAFV1c2VybmFtZTA7c4LzV05sG+DMt+rFB0NIJg==xxc>",
+ 	"<xxc(2)eMhAi/pYkW5jCmvKE5ZaTglQb+fTo1D8NxVitr5CCFADEgB7Ugdw/BAr6RoCABkWAFV1c2VybmFtZTE7fElAa7z3IcrYrrkwNjMS2w==xxc>",
+ 	"<xxc(2)d7RJTu61Vy1lDThDMn8rYIiKSe1uXA/RCvvcIhq5Yg4DEgB7Ugdw/BAr6RsCABkWAFV1c2VybmFtZTI7N3XWrxIUpR29atpFMkcR6A==xxc>"
+	}
+ - failedIDs - JSON marshalled list of []*id.ID objects which failed lookup
+ - err - any errors that occurred in the multilookup.
+ */
+@interface BindingsUdMultiLookupCallback : NSObject <goSeqRefInterface, BindingsUdMultiLookupCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)contactListJSON failedIDs:(NSData* _Nullable)failedIDs err:(NSError* _Nullable)err;
+@end
+
 /**
  * UdNetworkStatus contains the UdNetworkStatus, which is a bindings-level
 interface for ud.udNetworkStatus.
diff --git a/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Bindings b/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Bindings
index 42059901ccb6235d86e772871181ef017f1f7121..c03b3514dde5282a331b4eb6e4502dd88e118c73 100644
Binary files a/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Bindings and b/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Bindings differ
diff --git a/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Headers/Bindings.objc.h b/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Headers/Bindings.objc.h
index 8a469e985c895f732191ca1be50728da7528d8e3..96ddf1d0c47ebdea5dffbb77e053fbdd5e841798 100644
--- a/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Headers/Bindings.objc.h
+++ b/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Headers/Bindings.objc.h
@@ -84,6 +84,8 @@
 @class BindingsTrackServicesCallback;
 @protocol BindingsUdLookupCallback;
 @class BindingsUdLookupCallback;
+@protocol BindingsUdMultiLookupCallback;
+@class BindingsUdMultiLookupCallback;
 @protocol BindingsUdNetworkStatus;
 @class BindingsUdNetworkStatus;
 @protocol BindingsUdSearchCallback;
@@ -208,6 +210,10 @@ Parameters:
 - (void)callback:(NSData* _Nullable)contactBytes err:(NSError* _Nullable)err;
 @end
 
+@protocol BindingsUdMultiLookupCallback <NSObject>
+- (void)callback:(NSData* _Nullable)contactListJSON failedIDs:(NSData* _Nullable)failedIDs err:(NSError* _Nullable)err;
+@end
+
 @protocol BindingsUdNetworkStatus <NSObject>
 /**
  * UdNetworkStatus returns:
@@ -2114,6 +2120,24 @@ Returns:
  */
 FOUNDATION_EXPORT NSData* _Nullable BindingsLookupUD(long e2eID, NSData* _Nullable udContact, id<BindingsUdLookupCallback> _Nullable cb, NSData* _Nullable lookupId, NSData* _Nullable singleRequestParamsJSON, NSError* _Nullable* _Nullable error);
 
+/**
+ * MultiLookupUD returns the public key of all passed in IDs as known by the
+user discovery system or returns by the timeout.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker
+ - udContact - the marshalled bytes of the contact.Contact object
+ - lookupIds - JSON marshalled list of []*id.ID object for the users that
+   MultiLookupUD will look up.
+ - singleRequestParams - the JSON marshalled bytes of single.RequestParams
+
+Returns:
+ - []byte - the JSON marshalled bytes of the SingleUseSendReport object,
+   which can be passed into Cmix.WaitForRoundResult to see if the send
+   succeeded.
+ */
+FOUNDATION_EXPORT BOOL BindingsMultiLookupUD(long e2eID, NSData* _Nullable udContact, id<BindingsUdMultiLookupCallback> _Nullable cb, NSData* _Nullable lookupIds, NSData* _Nullable singleRequestParamsJSON, NSError* _Nullable* _Nullable error);
+
 /**
  * NewBroadcastChannel creates a bindings-layer broadcast channel and starts
 listening for new messages.
@@ -2465,6 +2489,8 @@ FOUNDATION_EXPORT BOOL BindingsUpdateCommonErrors(NSString* _Nullable jsonFile,
 
 @class BindingsUdLookupCallback;
 
+@class BindingsUdMultiLookupCallback;
+
 @class BindingsUdNetworkStatus;
 
 @class BindingsUdSearchCallback;
@@ -2805,6 +2831,31 @@ Parameters:
 - (void)callback:(NSData* _Nullable)contactBytes err:(NSError* _Nullable)err;
 @end
 
+/**
+ * UdMultiLookupCallback contains the callback called by MultiLookupUD that returns the
+contacts which match the passed in IDs.
+
+Parameters:
+ - contactListJSON - the JSON marshalled bytes of []contact.Contact, or nil
+   if an error occurs.
+
+  JSON Example:
+  {
+ 	"<xxc(2)F8dL9EC6gy+RMJuk3R+Au6eGExo02Wfio5cacjBcJRwDEgB7Ugdw/BAr6RkCABkWAFV1c2VybmFtZTA7c4LzV05sG+DMt+rFB0NIJg==xxc>",
+ 	"<xxc(2)eMhAi/pYkW5jCmvKE5ZaTglQb+fTo1D8NxVitr5CCFADEgB7Ugdw/BAr6RoCABkWAFV1c2VybmFtZTE7fElAa7z3IcrYrrkwNjMS2w==xxc>",
+ 	"<xxc(2)d7RJTu61Vy1lDThDMn8rYIiKSe1uXA/RCvvcIhq5Yg4DEgB7Ugdw/BAr6RsCABkWAFV1c2VybmFtZTI7N3XWrxIUpR29atpFMkcR6A==xxc>"
+	}
+ - failedIDs - JSON marshalled list of []*id.ID objects which failed lookup
+ - err - any errors that occurred in the multilookup.
+ */
+@interface BindingsUdMultiLookupCallback : NSObject <goSeqRefInterface, BindingsUdMultiLookupCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)contactListJSON failedIDs:(NSData* _Nullable)failedIDs err:(NSError* _Nullable)err;
+@end
+
 /**
  * UdNetworkStatus contains the UdNetworkStatus, which is a bindings-level
 interface for ud.udNetworkStatus.
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Bindings b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Bindings
index e4308e494b7c1c9233d1e4b05c6c458b2c055b14..bcea7d00c7ba5265cc4daf72def814d7065df731 100644
Binary files a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Bindings and b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Bindings differ
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.objc.h b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.objc.h
index 8a469e985c895f732191ca1be50728da7528d8e3..96ddf1d0c47ebdea5dffbb77e053fbdd5e841798 100644
--- a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.objc.h
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.objc.h
@@ -84,6 +84,8 @@
 @class BindingsTrackServicesCallback;
 @protocol BindingsUdLookupCallback;
 @class BindingsUdLookupCallback;
+@protocol BindingsUdMultiLookupCallback;
+@class BindingsUdMultiLookupCallback;
 @protocol BindingsUdNetworkStatus;
 @class BindingsUdNetworkStatus;
 @protocol BindingsUdSearchCallback;
@@ -208,6 +210,10 @@ Parameters:
 - (void)callback:(NSData* _Nullable)contactBytes err:(NSError* _Nullable)err;
 @end
 
+@protocol BindingsUdMultiLookupCallback <NSObject>
+- (void)callback:(NSData* _Nullable)contactListJSON failedIDs:(NSData* _Nullable)failedIDs err:(NSError* _Nullable)err;
+@end
+
 @protocol BindingsUdNetworkStatus <NSObject>
 /**
  * UdNetworkStatus returns:
@@ -2114,6 +2120,24 @@ Returns:
  */
 FOUNDATION_EXPORT NSData* _Nullable BindingsLookupUD(long e2eID, NSData* _Nullable udContact, id<BindingsUdLookupCallback> _Nullable cb, NSData* _Nullable lookupId, NSData* _Nullable singleRequestParamsJSON, NSError* _Nullable* _Nullable error);
 
+/**
+ * MultiLookupUD returns the public key of all passed in IDs as known by the
+user discovery system or returns by the timeout.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker
+ - udContact - the marshalled bytes of the contact.Contact object
+ - lookupIds - JSON marshalled list of []*id.ID object for the users that
+   MultiLookupUD will look up.
+ - singleRequestParams - the JSON marshalled bytes of single.RequestParams
+
+Returns:
+ - []byte - the JSON marshalled bytes of the SingleUseSendReport object,
+   which can be passed into Cmix.WaitForRoundResult to see if the send
+   succeeded.
+ */
+FOUNDATION_EXPORT BOOL BindingsMultiLookupUD(long e2eID, NSData* _Nullable udContact, id<BindingsUdMultiLookupCallback> _Nullable cb, NSData* _Nullable lookupIds, NSData* _Nullable singleRequestParamsJSON, NSError* _Nullable* _Nullable error);
+
 /**
  * NewBroadcastChannel creates a bindings-layer broadcast channel and starts
 listening for new messages.
@@ -2465,6 +2489,8 @@ FOUNDATION_EXPORT BOOL BindingsUpdateCommonErrors(NSString* _Nullable jsonFile,
 
 @class BindingsUdLookupCallback;
 
+@class BindingsUdMultiLookupCallback;
+
 @class BindingsUdNetworkStatus;
 
 @class BindingsUdSearchCallback;
@@ -2805,6 +2831,31 @@ Parameters:
 - (void)callback:(NSData* _Nullable)contactBytes err:(NSError* _Nullable)err;
 @end
 
+/**
+ * UdMultiLookupCallback contains the callback called by MultiLookupUD that returns the
+contacts which match the passed in IDs.
+
+Parameters:
+ - contactListJSON - the JSON marshalled bytes of []contact.Contact, or nil
+   if an error occurs.
+
+  JSON Example:
+  {
+ 	"<xxc(2)F8dL9EC6gy+RMJuk3R+Au6eGExo02Wfio5cacjBcJRwDEgB7Ugdw/BAr6RkCABkWAFV1c2VybmFtZTA7c4LzV05sG+DMt+rFB0NIJg==xxc>",
+ 	"<xxc(2)eMhAi/pYkW5jCmvKE5ZaTglQb+fTo1D8NxVitr5CCFADEgB7Ugdw/BAr6RoCABkWAFV1c2VybmFtZTE7fElAa7z3IcrYrrkwNjMS2w==xxc>",
+ 	"<xxc(2)d7RJTu61Vy1lDThDMn8rYIiKSe1uXA/RCvvcIhq5Yg4DEgB7Ugdw/BAr6RsCABkWAFV1c2VybmFtZTI7N3XWrxIUpR29atpFMkcR6A==xxc>"
+	}
+ - failedIDs - JSON marshalled list of []*id.ID objects which failed lookup
+ - err - any errors that occurred in the multilookup.
+ */
+@interface BindingsUdMultiLookupCallback : NSObject <goSeqRefInterface, BindingsUdMultiLookupCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)contactListJSON failedIDs:(NSData* _Nullable)failedIDs err:(NSError* _Nullable)err;
+@end
+
 /**
  * UdNetworkStatus contains the UdNetworkStatus, which is a bindings-level
 interface for ud.udNetworkStatus.
diff --git a/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift b/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift
new file mode 100644
index 0000000000000000000000000000000000000000..9a6d9df64e56f28edc072449bc0dac5be7de6aa4
--- /dev/null
+++ b/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift
@@ -0,0 +1,55 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct UdMultiLookupCallback {
+  public enum Result: Equatable {
+    case success([Contact])
+    case failure(error: NSError, failedIDs: [Data])
+  }
+
+  public init(handle: @escaping (Result) -> Void) {
+    self.handle = handle
+  }
+
+  public var handle: (Result) -> Void
+}
+
+extension UdMultiLookupCallback {
+  public static let unimplemented = UdMultiLookupCallback(
+    handle: XCTUnimplemented("\(Self.self)")
+  )
+}
+
+extension UdMultiLookupCallback {
+  func makeBindingsUdMultiLookupCallback() -> BindingsUdMultiLookupCallbackProtocol {
+    class CallbackObject: NSObject, BindingsUdMultiLookupCallbackProtocol {
+      init(_ callback: UdMultiLookupCallback) {
+        self.callback = callback
+      }
+
+      let callback: UdMultiLookupCallback
+
+      func callback(_ contactListJSON: Data?, failedIDs: Data?, err: Error?) {
+        if let err = err {
+          callback.handle(.failure(
+            error: err as NSError,
+            failedIDs: failedIDs
+              .map { (try? JSONDecoder().decode([Data].self, from: $0)) ?? [] } ?? []
+          ))
+        } else if let contactListJSON = contactListJSON {
+          do {
+            let contactsData = try JSONDecoder().decode([Data].self, from: contactListJSON)
+            let contacts: [Contact] = contactsData.map { Contact.live($0) }
+            callback.handle(.success(contacts))
+          } catch {
+            callback.handle(.failure(error: error as NSError, failedIDs: []))
+          }
+        } else {
+          fatalError("BindingsUdMultiLookupCallbackProtocol received `nil` contactListJSON and `nil` error")
+        }
+      }
+    }
+
+    return CallbackObject(self)
+  }
+}
diff --git a/Sources/XXClient/Functions/MultiLookupUD.swift b/Sources/XXClient/Functions/MultiLookupUD.swift
new file mode 100644
index 0000000000000000000000000000000000000000..0cf81669219d1327ae1686056253a747762a1055
--- /dev/null
+++ b/Sources/XXClient/Functions/MultiLookupUD.swift
@@ -0,0 +1,57 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct MultiLookupUD {
+  public struct Params: Equatable {
+    public init(
+      e2eId: Int,
+      udContact: Data,
+      lookupIds: [Data],
+      singleRequestParams: Data = GetSingleUseParams.liveDefault()
+    ) {
+      self.e2eId = e2eId
+      self.udContact = udContact
+      self.lookupIds = lookupIds
+      self.singleRequestParams = singleRequestParams
+    }
+
+    public var e2eId: Int
+    public var udContact: Data
+    public var lookupIds: [Data]
+    public var singleRequestParams: Data
+  }
+
+  public var run: (Params, UdMultiLookupCallback) throws -> Void
+
+  public func callAsFunction(params: Params, callback: UdMultiLookupCallback) throws -> Void {
+    try run(params, callback)
+  }
+}
+
+extension MultiLookupUD {
+  public static func live() -> MultiLookupUD {
+    MultiLookupUD { params, callback in
+      var error: NSError?
+      let result = BindingsMultiLookupUD(
+        params.e2eId,
+        params.udContact,
+        callback.makeBindingsUdMultiLookupCallback(),
+        try JSONEncoder().encode(params.lookupIds),
+        params.singleRequestParams,
+        &error
+      )
+      if let error = error {
+        throw error
+      }
+      guard result else {
+        fatalError("BindingsMultiLookupUD returned `false` without providing error")
+      }
+    }
+  }
+}
+
+extension MultiLookupUD {
+  public static let unimplemented = MultiLookupUD(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}