diff --git a/lib/types/sqlite-types.js b/lib/types/sqlite-types.js
--- a/lib/types/sqlite-types.js
+++ b/lib/types/sqlite-types.js
@@ -1,7 +1,9 @@
 // @flow
 
+import type { IdentityAuthResult } from './identity-service-types.js';
 import type { ClientDBMessageInfo } from './message-types.js';
 import type { StoreOperations } from './store-ops-types.js';
+import type { QRAuthBackupData } from './tunnelbroker/qr-code-auth-message-types.js';
 import type { ClientDBDMOperation } from '../ops/dm-operations-store-ops.js';
 
 export const outboundP2PMessageStatuses = Object.freeze({
@@ -86,4 +88,10 @@
     operations: StoreOperations,
     userID?: ?string,
   ) => Promise<void>,
+
+  // backup
+  +restoreUserData: (
+    qrAuthBackupData: QRAuthBackupData,
+    identityAuthResult: IdentityAuthResult,
+  ) => Promise<void>,
 };
diff --git a/lib/utils/__mocks__/config.js b/lib/utils/__mocks__/config.js
--- a/lib/utils/__mocks__/config.js
+++ b/lib/utils/__mocks__/config.js
@@ -47,6 +47,7 @@
     searchMessages: jest.fn(),
     fetchMessages: jest.fn(),
     fetchDMOperationsByType: jest.fn(),
+    restoreUserData: jest.fn(),
   },
   encryptedNotifUtilsAPI: {
     generateAESKey: jest.fn(),
diff --git a/native/database/sqlite-api.js b/native/database/sqlite-api.js
--- a/native/database/sqlite-api.js
+++ b/native/database/sqlite-api.js
@@ -4,9 +4,11 @@
 import { convertStoreOperationsToClientDBStoreOperations } from 'lib/shared/redux/client-db-utils.js';
 import type { SQLiteAPI } from 'lib/types/sqlite-types.js';
 import type { StoreOperations } from 'lib/types/store-ops-types';
+import type { QRAuthBackupData } from 'lib/types/tunnelbroker/qr-code-auth-message-types.js';
 import { values } from 'lib/utils/objects.js';
 
 import { commCoreModule } from '../native-modules.js';
+import { storeVersion } from '../redux/persist-constants.js';
 import { isTaskCancelledError } from '../utils/error-handling.js';
 
 const sqliteAPI: SQLiteAPI = {
@@ -61,6 +63,17 @@
       commCoreModule.terminate();
     }
   },
+
+  //backup
+  async restoreUserData(qrAuthBackupData: QRAuthBackupData): Promise<void> {
+    const { backupID, backupDataKey, backupLogDataKey } = qrAuthBackupData;
+    return commCoreModule.restoreBackupData(
+      backupID,
+      backupDataKey,
+      backupLogDataKey,
+      storeVersion.toString(),
+    );
+  },
 };
 
 export { sqliteAPI };
diff --git a/web/database/sqlite-api.js b/web/database/sqlite-api.js
--- a/web/database/sqlite-api.js
+++ b/web/database/sqlite-api.js
@@ -2,6 +2,7 @@
 
 import type { ClientDBDMOperation } from 'lib/ops/dm-operations-store-ops.js';
 import { convertStoreOperationsToClientDBStoreOperations } from 'lib/shared/redux/client-db-utils.js';
+import type { IdentityAuthResult } from 'lib/types/identity-service-types.js';
 import type { ClientDBMessageInfo } from 'lib/types/message-types.js';
 import type {
   SQLiteAPI,
@@ -9,6 +10,8 @@
   OutboundP2PMessage,
 } from 'lib/types/sqlite-types.js';
 import type { StoreOperations } from 'lib/types/store-ops-types.js';
+import type { QRAuthBackupData } from 'lib/types/tunnelbroker/qr-code-auth-message-types.js';
+import { getContentSigningKey } from 'lib/utils/crypto-utils.js';
 import { entries, values } from 'lib/utils/objects.js';
 
 import { getCommSharedWorker } from '../shared-worker/shared-worker-provider.js';
@@ -210,6 +213,30 @@
       }
     }
   },
+
+  //backup
+  async restoreUserData(
+    qrAuthBackupData: QRAuthBackupData,
+    identityAuthResult: IdentityAuthResult,
+  ): Promise<void> {
+    const { backupID, backupDataKey, backupLogDataKey } = qrAuthBackupData;
+    const { userID, accessToken } = identityAuthResult;
+    const [deviceID, sharedWorker] = await Promise.all([
+      getContentSigningKey(),
+      getCommSharedWorker(),
+    ]);
+    await sharedWorker.schedule({
+      type: workerRequestMessageTypes.BACKUP_RESTORE,
+      authMetadata: {
+        deviceID,
+        userID,
+        accessToken,
+      },
+      backupID,
+      backupDataKey,
+      backupLogDataKey,
+    });
+  },
 };
 
 export { sqliteAPI };