diff --git a/keyserver/src/responders/activity-responders.js b/keyserver/src/responders/activity-responders.js
--- a/keyserver/src/responders/activity-responders.js
+++ b/keyserver/src/responders/activity-responders.js
@@ -39,7 +39,11 @@
 ): Promise<UpdateActivityResult> {
   const request = await validateInput(viewer, inputValidator, input);
   const result = await activityUpdater(viewer, request);
-  return validateOutput(viewer, updateActivityResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    updateActivityResultValidator,
+    result,
+  );
 }
 
 const setThreadUnreadStatusValidator = tShape<SetThreadUnreadStatusRequest>({
@@ -58,7 +62,11 @@
   );
 
   const result = await setThreadUnreadStatus(viewer, request);
-  return validateOutput(viewer, setThreadUnreadStatusResult, result);
+  return validateOutput(
+    viewer.platformDetails,
+    setThreadUnreadStatusResult,
+    result,
+  );
 }
 
 export {
diff --git a/keyserver/src/responders/entry-responders.js b/keyserver/src/responders/entry-responders.js
--- a/keyserver/src/responders/entry-responders.js
+++ b/keyserver/src/responders/entry-responders.js
@@ -148,10 +148,14 @@
   await verifyCalendarQueryThreadIDs(request);
 
   const response = await fetchEntryInfos(viewer, [request]);
-  return validateOutput(viewer, fetchEntryInfosResponseValidator, {
-    ...response,
-    userInfos: {},
-  });
+  return validateOutput(
+    viewer.platformDetails,
+    fetchEntryInfosResponseValidator,
+    {
+      ...response,
+      userInfos: {},
+    },
+  );
 }
 
 const entryRevisionHistoryFetchInputValidator =
@@ -176,7 +180,7 @@
   const entryHistory = await fetchEntryRevisionInfo(viewer, request.id);
   const response = { result: entryHistory };
   return validateOutput(
-    viewer,
+    viewer.platformDetails,
     fetchEntryRevisionInfosResultValidator,
     response,
   );
@@ -209,7 +213,11 @@
     input,
   );
   const response = await createEntry(viewer, request);
-  return validateOutput(viewer, saveEntryResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    saveEntryResponseValidator,
+    response,
+  );
 }
 
 const saveEntryRequestInputValidator = tShape<SaveEntryRequest>({
@@ -231,7 +239,11 @@
     input,
   );
   const response = await updateEntry(viewer, request);
-  return validateOutput(viewer, saveEntryResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    saveEntryResponseValidator,
+    response,
+  );
 }
 
 const deleteEntryRequestInputValidator = tShape<DeleteEntryRequest>({
@@ -259,7 +271,11 @@
     input,
   );
   const response = await deleteEntry(viewer, request);
-  return validateOutput(viewer, deleteEntryResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    deleteEntryResponseValidator,
+    response,
+  );
 }
 
 const restoreEntryRequestInputValidator = tShape<RestoreEntryRequest>({
@@ -285,7 +301,11 @@
     input,
   );
   const response = await restoreEntry(viewer, request);
-  return validateOutput(viewer, restoreEntryResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    restoreEntryResponseValidator,
+    response,
+  );
 }
 
 export const deltaEntryInfosResultValidator: TInterface<DeltaEntryInfosResult> =
@@ -318,12 +338,16 @@
     commitSessionUpdate(viewer, sessionUpdate),
   ]);
 
-  return validateOutput(viewer, deltaEntryInfosResultValidator, {
-    rawEntryInfos: response.rawEntryInfos,
-    deletedEntryIDs: response.deletedEntryIDs,
-    // Old clients expect userInfos object
-    userInfos: [],
-  });
+  return validateOutput(
+    viewer.platformDetails,
+    deltaEntryInfosResultValidator,
+    {
+      rawEntryInfos: response.rawEntryInfos,
+      deletedEntryIDs: response.deletedEntryIDs,
+      // Old clients expect userInfos object
+      userInfos: [],
+    },
+  );
 }
 
 export {
diff --git a/keyserver/src/responders/keys-responders.js b/keyserver/src/responders/keys-responders.js
--- a/keyserver/src/responders/keys-responders.js
+++ b/keyserver/src/responders/keys-responders.js
@@ -35,7 +35,7 @@
   );
   const response = await fetchSessionPublicKeys(request.session);
   return validateOutput(
-    viewer,
+    viewer.platformDetails,
     getSessionPublicKeysResponseValidator,
     response,
   );
diff --git a/keyserver/src/responders/message-report-responder.js b/keyserver/src/responders/message-report-responder.js
--- a/keyserver/src/responders/message-report-responder.js
+++ b/keyserver/src/responders/message-report-responder.js
@@ -33,7 +33,11 @@
 
   const rawMessageInfos = await createMessageReport(viewer, request);
   const result = { messageInfo: rawMessageInfos[0] };
-  return validateOutput(viewer, messageReportCreationResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    messageReportCreationResultValidator,
+    result,
+  );
 }
 
 export { messageReportCreationResponder };
diff --git a/keyserver/src/responders/message-responders.js b/keyserver/src/responders/message-responders.js
--- a/keyserver/src/responders/message-responders.js
+++ b/keyserver/src/responders/message-responders.js
@@ -123,7 +123,11 @@
   const rawMessageInfos = await createMessages(viewer, [messageData]);
 
   const response = { newMessageInfo: rawMessageInfos[0] };
-  return validateOutput(viewer, sendMessageResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    sendMessageResponseValidator,
+    response,
+  );
 }
 
 const fetchMessageInfosRequestInputValidator = tShape<FetchMessageInfosRequest>(
@@ -154,10 +158,14 @@
     { threadCursors: request.cursors },
     request.numberPerThread ? request.numberPerThread : defaultNumberPerThread,
   );
-  return validateOutput(viewer, fetchMessageInfosResponseValidator, {
-    ...response,
-    userInfos: {},
-  });
+  return validateOutput(
+    viewer.platformDetails,
+    fetchMessageInfosResponseValidator,
+    {
+      ...response,
+      userInfos: {},
+    },
+  );
 }
 
 const sendMultimediaMessageRequestInputValidator =
@@ -253,7 +261,11 @@
   }
 
   const response = { newMessageInfo };
-  return validateOutput(viewer, sendMessageResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    sendMessageResponseValidator,
+    response,
+  );
 }
 
 const sendReactionMessageRequestInputValidator =
@@ -332,7 +344,11 @@
   const rawMessageInfos = await createMessages(viewer, [messageData]);
 
   const response = { newMessageInfo: rawMessageInfos[0] };
-  return validateOutput(viewer, sendMessageResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    sendMessageResponseValidator,
+    response,
+  );
 }
 
 const editMessageRequestInputValidator = tShape<SendEditMessageRequest>({
@@ -426,7 +442,11 @@
   const newMessageInfos = await createMessages(viewer, messagesData);
 
   const response = { newMessageInfos };
-  return validateOutput(viewer, sendEditMessageResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    sendEditMessageResponseValidator,
+    response,
+  );
 }
 
 const fetchPinnedMessagesResponderInputValidator =
@@ -449,7 +469,11 @@
     input,
   );
   const response = await fetchPinnedMessageInfos(viewer, request);
-  return validateOutput(viewer, fetchPinnedMessagesResultValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    fetchPinnedMessagesResultValidator,
+    response,
+  );
 }
 
 export {
diff --git a/keyserver/src/responders/relationship-responders.js b/keyserver/src/responders/relationship-responders.js
--- a/keyserver/src/responders/relationship-responders.js
+++ b/keyserver/src/responders/relationship-responders.js
@@ -35,7 +35,11 @@
     input,
   );
   const response = await updateRelationships(viewer, request);
-  return validateOutput(viewer, relationshipErrorsValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    relationshipErrorsValidator,
+    response,
+  );
 }
 
 export { updateRelationshipsResponder };
diff --git a/keyserver/src/responders/report-responders.js b/keyserver/src/responders/report-responders.js
--- a/keyserver/src/responders/report-responders.js
+++ b/keyserver/src/responders/report-responders.js
@@ -159,7 +159,11 @@
   if (!response) {
     throw new ServerError('ignored_report');
   }
-  return validateOutput(viewer, reportCreationResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    reportCreationResponseValidator,
+    response,
+  );
 }
 
 const reportMultiCreationRequestInputValidator =
@@ -232,7 +236,7 @@
   );
   const response = await fetchErrorReportInfos(viewer, request);
   return validateOutput(
-    viewer,
+    viewer.platformDetails,
     fetchErrorReportInfosResponseValidator,
     response,
   );
diff --git a/keyserver/src/responders/search-responders.js b/keyserver/src/responders/search-responders.js
--- a/keyserver/src/responders/search-responders.js
+++ b/keyserver/src/responders/search-responders.js
@@ -33,7 +33,11 @@
   );
   const searchResults = await searchForUsers(request);
   const result = { userInfos: searchResults };
-  return validateOutput(viewer, userSearchResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    userSearchResultValidator,
+    result,
+  );
 }
 
 export { userSearchResponder };
diff --git a/keyserver/src/responders/thread-responders.js b/keyserver/src/responders/thread-responders.js
--- a/keyserver/src/responders/thread-responders.js
+++ b/keyserver/src/responders/thread-responders.js
@@ -81,7 +81,11 @@
     input,
   );
   const result = await deleteThread(viewer, request);
-  return validateOutput(viewer, leaveThreadResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    leaveThreadResultValidator,
+    result,
+  );
 }
 
 export const roleChangeRequestInputValidator: TInterface<RoleChangeRequest> =
@@ -117,7 +121,11 @@
     input,
   );
   const result = await updateRole(viewer, request);
-  return validateOutput(viewer, changeThreadSettingsResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    changeThreadSettingsResultValidator,
+    result,
+  );
 }
 
 const removeMembersRequestInputValidator = tShape<RemoveMembersRequest>({
@@ -135,7 +143,11 @@
     input,
   );
   const result = await removeMembers(viewer, request);
-  return validateOutput(viewer, changeThreadSettingsResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    changeThreadSettingsResultValidator,
+    result,
+  );
 }
 
 const leaveThreadRequestInputValidator = tShape<LeaveThreadRequest>({
@@ -152,7 +164,11 @@
     input,
   );
   const result = await leaveThread(viewer, request);
-  return validateOutput(viewer, leaveThreadResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    leaveThreadResultValidator,
+    result,
+  );
 }
 
 const updateThreadRequestInputValidator = tShape<UpdateThreadRequest>({
@@ -179,7 +195,11 @@
     input,
   );
   const result = await updateThread(viewer, request);
-  return validateOutput(viewer, changeThreadSettingsResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    changeThreadSettingsResultValidator,
+    result,
+  );
 }
 
 const threadRequestValidationShape = {
@@ -233,7 +253,11 @@
   const result = await createThread(viewer, request, {
     silentlyFailMembers: request.type === threadTypes.SIDEBAR,
   });
-  return validateOutput(viewer, newThreadResponseValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    newThreadResponseValidator,
+    result,
+  );
 }
 
 const joinThreadRequestInputValidator = tShape<ServerThreadJoinRequest>({
@@ -269,7 +293,11 @@
   }
 
   const result = await joinThread(viewer, request);
-  return validateOutput(viewer, threadJoinResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    threadJoinResultValidator,
+    result,
+  );
 }
 
 const threadFetchMediaRequestInputValidator = tShape<ThreadFetchMediaRequest>({
@@ -291,7 +319,11 @@
     input,
   );
   const result = await fetchMediaForThread(viewer, request);
-  return validateOutput(viewer, threadFetchMediaResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    threadFetchMediaResultValidator,
+    result,
+  );
 }
 
 const toggleMessagePinRequestInputValidator = tShape<ToggleMessagePinRequest>({
@@ -315,7 +347,11 @@
     input,
   );
   const result = await toggleMessagePinForThread(viewer, request);
-  return validateOutput(viewer, toggleMessagePinResultValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    toggleMessagePinResultValidator,
+    result,
+  );
 }
 
 export {
diff --git a/keyserver/src/responders/user-responders.js b/keyserver/src/responders/user-responders.js
--- a/keyserver/src/responders/user-responders.js
+++ b/keyserver/src/responders/user-responders.js
@@ -157,9 +157,13 @@
     input,
   );
   const threadSubscription = await userSubscriptionUpdater(viewer, request);
-  return validateOutput(viewer, subscriptionUpdateResponseValidator, {
-    threadSubscription,
-  });
+  return validateOutput(
+    viewer.platformDetails,
+    subscriptionUpdateResponseValidator,
+    {
+      threadSubscription,
+    },
+  );
 }
 
 const accountUpdateInputValidator = tShape<PasswordUpdate>({
@@ -230,7 +234,11 @@
       anonymous: true,
     },
   };
-  return validateOutput(viewer, logOutResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    logOutResponseValidator,
+    response,
+  );
 }
 
 const deleteAccountRequestInputValidator = tShape<DeleteAccountRequest>({
@@ -248,7 +256,11 @@
   );
   const result = await deleteAccount(viewer, request);
   invariant(result, 'deleteAccount should return result if handed request');
-  return validateOutput(viewer, logOutResponseValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    logOutResponseValidator,
+    result,
+  );
 }
 
 const deviceTokenUpdateRequestInputValidator = tShape({
@@ -313,7 +325,11 @@
     }
   }
   const response = await createAccount(viewer, request);
-  return validateOutput(viewer, registerResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    registerResponseValidator,
+    response,
+  );
 }
 
 type ProcessSuccessfulLoginParams = {
@@ -528,7 +544,11 @@
     calendarQuery,
     signedIdentityKeysBlob,
   });
-  return validateOutput(viewer, logInResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    logInResponseValidator,
+    response,
+  );
 }
 
 const siweAuthRequestInputValidator = tShape<SIWEAuthRequest>({
@@ -668,7 +688,11 @@
     socialProof,
     signedIdentityKeysBlob,
   });
-  return validateOutput(viewer, logInResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    logInResponseValidator,
+    response,
+  );
 }
 
 const updatePasswordRequestInputValidator = tShape<UpdatePasswordRequest>({
@@ -694,7 +718,11 @@
     request.calendarQuery = normalizeCalendarQuery(request.calendarQuery);
   }
   const response = await updatePassword(viewer, request);
-  return validateOutput(viewer, logInResponseValidator, response);
+  return validateOutput(
+    viewer.platformDetails,
+    logInResponseValidator,
+    response,
+  );
 }
 
 const updateUserSettingsInputValidator = tShape<UpdateUserSettingsRequest>({
@@ -754,7 +782,11 @@
     input,
   );
   const result = await updateUserAvatar(viewer, request);
-  return validateOutput(viewer, updateUserAvatarResponderValidator, result);
+  return validateOutput(
+    viewer.platformDetails,
+    updateUserAvatarResponderValidator,
+    result,
+  );
 }
 
 export {
diff --git a/keyserver/src/responders/website-responders.js b/keyserver/src/responders/website-responders.js
--- a/keyserver/src/responders/website-responders.js
+++ b/keyserver/src/responders/website-responders.js
@@ -527,7 +527,7 @@
     commServicesAccessToken: null,
   });
   const validatedInitialReduxState = validateOutput(
-    viewer,
+    viewer.platformDetails,
     initialReduxStateValidator,
     initialReduxState,
   );
diff --git a/keyserver/src/socket/socket.js b/keyserver/src/socket/socket.js
--- a/keyserver/src/socket/socket.js
+++ b/keyserver/src/socket/socket.js
@@ -380,7 +380,7 @@
     if (this.ws.readyState === 1) {
       const { viewer } = this;
       const validatedMessage = validateOutput(
-        viewer,
+        viewer?.platformDetails,
         serverServerSocketMessageValidator,
         message,
       );
diff --git a/keyserver/src/utils/validation-utils.js b/keyserver/src/utils/validation-utils.js
--- a/keyserver/src/utils/validation-utils.js
+++ b/keyserver/src/utils/validation-utils.js
@@ -5,8 +5,11 @@
 import type { TType, TInterface } from 'tcomb';
 
 import type { PolicyType } from 'lib/facts/policies.js';
-import { hasMinCodeVersion } from 'lib/shared/version-utils.js';
-import { isWebPlatform } from 'lib/types/device-types.js';
+import {
+  hasMinCodeVersion,
+  FUTURE_CODE_VERSION,
+} from 'lib/shared/version-utils.js';
+import { type PlatformDetails, isWebPlatform } from 'lib/types/device-types.js';
 import { ServerError } from 'lib/utils/errors.js';
 import {
   tCookie,
@@ -35,7 +38,7 @@
   const convertedInput = checkInputValidator(inputValidator, input);
 
   if (
-    hasMinCodeVersion(viewer.platformDetails, 1000) &&
+    hasMinCodeVersion(viewer.platformDetails, FUTURE_CODE_VERSION) &&
     !isWebPlatform(viewer.platformDetails?.platform) &&
     convertToNewIDSchema
   ) {
@@ -50,7 +53,7 @@
 }
 
 function validateOutput<T>(
-  viewer: ?Viewer,
+  platformDetails: ?PlatformDetails,
   outputValidator: TType<T>,
   data: T,
 ): T {
@@ -63,8 +66,8 @@
   }
 
   if (
-    hasMinCodeVersion(viewer?.platformDetails, 1000) &&
-    !isWebPlatform(viewer?.platformDetails?.platform) &&
+    hasMinCodeVersion(platformDetails, FUTURE_CODE_VERSION) &&
+    !isWebPlatform(platformDetails?.platform) &&
     convertToNewIDSchema
   ) {
     return convertServerIDsToClientIDs(