diff --git a/.github/workflows/ci.build.push.yml b/.github/workflows/ci.build.push.yml
index 06f68a2f765c5bbcaae97b789bf918a501f72391..cb894d4cebc46c0172ba86bf02e892d095eed819 100644
--- a/.github/workflows/ci.build.push.yml
+++ b/.github/workflows/ci.build.push.yml
@@ -9,6 +9,8 @@ on:
       - v2
       - v3
       - translations*
+      - snyk*
+      - dependabot*
 
 jobs:
   main:
diff --git a/.rubocop.yml b/.rubocop.yml
index 0b5ffffe5c1ff7145ccf0cfaff942e9e8d44c574..9f6ae1c9eb438eec5f0def8803b96d4d1d491bf2 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -95,3 +95,6 @@ Rails/Output:
 Rails/RootPathnameMethods:
   Enabled: false
 
+Rails/ThreeStateBooleanColumn:
+  Enabled: false
+
diff --git a/app/controllers/api/v1/admin/server_rooms_controller.rb b/app/controllers/api/v1/admin/server_rooms_controller.rb
index c45fdc15caee38cfbbe9b3e68638e9f3fb9569b6..f509982642b4d1d0d6580446b8e9a4bbccbc7655 100644
--- a/app/controllers/api/v1/admin/server_rooms_controller.rb
+++ b/app/controllers/api/v1/admin/server_rooms_controller.rb
@@ -36,7 +36,7 @@ module Api
 
           pagy, paged_rooms = pagy(rooms)
 
-          RunningMeetingChecker.new(rooms: paged_rooms.select(&:online)).call if paged_rooms.select(&:online).any?
+          RunningMeetingChecker.new(rooms: paged_rooms.select(&:online)).call if paged_rooms.any?(&:online)
 
           render_data data: paged_rooms, meta: pagy_metadata(pagy), serializer: ServerRoomSerializer, status: :ok
         end
diff --git a/app/controllers/api/v1/rooms_configurations_controller.rb b/app/controllers/api/v1/rooms_configurations_controller.rb
index 66524eb4a8fde0b004b9dc8cc4eb536c3c1f7bfb..1b209354265cd1d8c9e01b8d927fd068c7a21a30 100644
--- a/app/controllers/api/v1/rooms_configurations_controller.rb
+++ b/app/controllers/api/v1/rooms_configurations_controller.rb
@@ -45,7 +45,7 @@ module Api
 
         render_data data: config_value, status: :ok
       rescue StandardError
-        return render_error status: :not_found unless config_value
+        render_error status: :not_found unless config_value
       end
     end
   end
diff --git a/app/controllers/api/v1/rooms_controller.rb b/app/controllers/api/v1/rooms_controller.rb
index 0cfd7962d66292bee27a6e2eca022158deceb238..ffde5ff5fd1455ba02f1985c97d4ac36fbbb8e13 100644
--- a/app/controllers/api/v1/rooms_controller.rb
+++ b/app/controllers/api/v1/rooms_controller.rb
@@ -51,7 +51,7 @@ module Api
           room.shared = true if room.user_id != current_user.id
         end
 
-        RunningMeetingChecker.new(rooms: rooms.select(&:online)).call if rooms.select(&:online).any?
+        RunningMeetingChecker.new(rooms: rooms.select(&:online)).call if rooms.any?(&:online)
 
         render_data data: rooms, status: :ok
       end
diff --git a/app/controllers/api/v1/verify_account_controller.rb b/app/controllers/api/v1/verify_account_controller.rb
index 8be2b92f61921f89defb32e2b27448742cc00ff8..a0e4430ad5448001475a2129eb12b09903ce8665 100644
--- a/app/controllers/api/v1/verify_account_controller.rb
+++ b/app/controllers/api/v1/verify_account_controller.rb
@@ -62,7 +62,7 @@ module Api
         return render_error status: :bad_request unless params[:user]
 
         @user = User.find_by id: params[:user][:id]
-        return render_data status: :ok unless @user && !@user.verified?
+        render_data status: :ok unless @user && !@user.verified?
       end
     end
   end
diff --git a/app/controllers/concerns/authorizable.rb b/app/controllers/concerns/authorizable.rb
index 5de6097ddad113afb2e8a9bef44dbe96e0abf13e..cea926b72bafcc97168adbb15cbb75d380279ef8 100644
--- a/app/controllers/concerns/authorizable.rb
+++ b/app/controllers/concerns/authorizable.rb
@@ -21,17 +21,17 @@ module Authorizable
 
   # Unless the request format is explicitly json Rails will mitigate the responsibility to CSR to handle it.
   def ensure_valid_request
-    return render 'components/index' if !Rails.env.development? && !valid_api_request?
+    render 'components/index' if !Rails.env.development? && !valid_api_request?
   end
 
   # Ensures that the user is logged in
   def ensure_authenticated
-    return render_error status: :unauthorized unless current_user
+    render_error status: :unauthorized unless current_user
   end
 
   # PermissionsChecker service will return a true or false depending on whether the current_user's role has the provided permission_name
   def ensure_authorized(permission_names, user_id: nil, friendly_id: nil, record_id: nil)
-    return render_error status: :forbidden unless PermissionsChecker.new(
+    render_error status: :forbidden unless PermissionsChecker.new(
       current_user:,
       permission_names:,
       user_id:,
@@ -42,7 +42,7 @@ module Authorizable
   end
 
   def ensure_super_admin
-    return render_error status: :forbidden unless current_user.super_admin?
+    render_error status: :forbidden unless current_user.super_admin?
   end
 
   private
diff --git a/app/controllers/concerns/presentable.rb b/app/controllers/concerns/presentable.rb
index 6ab661f5d26783ab08d229d528a30084bed60c85..06a59f201ed2c6d758f64e5f149686894e2f7415 100644
--- a/app/controllers/concerns/presentable.rb
+++ b/app/controllers/concerns/presentable.rb
@@ -20,7 +20,7 @@ module Presentable
   extend ActiveSupport::Concern
 
   def presentation_file_name(room)
-    return room.presentation.filename if room.presentation.attached?
+    room.presentation.filename if room.presentation.attached?
   end
 
   def presentation_thumbnail(room)
diff --git a/db/migrate/20230705183746_create_active_storage_variant_records.active_storage.rb b/db/migrate/20230705183746_create_active_storage_variant_records.active_storage.rb
index 91e341db2a9695729f0885db66389d22cc6a4cb0..2a94068d18fbe792af84aee22458f4dc46c92c4d 100644
--- a/db/migrate/20230705183746_create_active_storage_variant_records.active_storage.rb
+++ b/db/migrate/20230705183746_create_active_storage_variant_records.active_storage.rb
@@ -7,7 +7,7 @@ class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0]
 
     # Use Active Record's configured type for primary key
 
-    create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t| # rubocop:disable Rails/CreateTableWithTimestamps
+    create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t|
       t.belongs_to :blob, null: false, index: false, type: blobs_primary_key_type
       t.string :variation_digest, null: false
 
diff --git a/lib/tasks/poller.rake b/lib/tasks/poller.rake
index a4a3070d7904da7268ddd2fd46ac60a6a1f6b16a..b88091082fdd2c92802f2b7434af0affcddcf1d1 100644
--- a/lib/tasks/poller.rake
+++ b/lib/tasks/poller.rake
@@ -46,7 +46,6 @@ namespace :poller do
     online_meetings = Room.includes(:user).where(online: true)
 
     RunningMeetingChecker.new(rooms: online_meetings).call
-
   rescue StandardError => e
     err "Unable to poll meetings. Error: #{e}"
   end
@@ -72,7 +71,6 @@ namespace :poller do
         end
 
         RecordingCreator.new(recording:).call
-
       rescue StandardError => e
         err "Unable to poll Recording:\nRecordID: #{recording[:recordID]}\nError: #{e}"
         next
diff --git a/spec/controllers/admin/invitations_controller_spec.rb b/spec/controllers/admin/invitations_controller_spec.rb
index 12392a14cade50f29a61ea13507d78d776b77508..5ad306a93c0bb08a8e230f8f3a9618b364f6756c 100644
--- a/spec/controllers/admin/invitations_controller_spec.rb
+++ b/spec/controllers/admin/invitations_controller_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe Api::V1::Admin::InvitationsController, type: :controller do
       get :index
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('email')).to match_array(invitations.pluck(:email))
+      expect(response.parsed_body['data'].pluck('email')).to match_array(invitations.pluck(:email))
     end
 
     it 'returns the invitations according to the query' do
@@ -52,7 +52,7 @@ RSpec.describe Api::V1::Admin::InvitationsController, type: :controller do
 
       get :index, params: { search: 'test.com' }
 
-      expect(JSON.parse(response.body)['data'].pluck('email')).to match_array(invitations.pluck(:email))
+      expect(response.parsed_body['data'].pluck('email')).to match_array(invitations.pluck(:email))
     end
 
     context 'user without ManageUsers permission' do
@@ -74,7 +74,7 @@ RSpec.describe Api::V1::Admin::InvitationsController, type: :controller do
       expect { post :create, params: { invitations: valid_params } }.to change(Invitation, :count).by(3)
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['errors']).to be_nil
+      expect(response.parsed_body['errors']).to be_nil
     end
 
     it 'emails the invitations to the invited user' do
diff --git a/spec/controllers/admin/role_permissions_controller_spec.rb b/spec/controllers/admin/role_permissions_controller_spec.rb
index 7f7559c4b48f0dea70295ca8e2c4fa2b081ce1d6..fdcf26f58579d75c076a4ae7f3d064d556bc3b47 100644
--- a/spec/controllers/admin/role_permissions_controller_spec.rb
+++ b/spec/controllers/admin/role_permissions_controller_spec.rb
@@ -32,10 +32,10 @@ RSpec.describe Api::V1::Admin::RolePermissionsController, type: :controller do
       get :index, params: { role_id: user_with_manage_roles_permission.role_id }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['CreateRoom']).to eq('true')
-      expect(JSON.parse(response.body)['data']['RoomLimit']).to eq('100')
-      expect(JSON.parse(response.body)['data']['SharedList']).to eq('true')
-      expect(JSON.parse(response.body)['data']['ManageRoles']).to eq('true')
+      expect(response.parsed_body['data']['CreateRoom']).to eq('true')
+      expect(response.parsed_body['data']['RoomLimit']).to eq('100')
+      expect(response.parsed_body['data']['SharedList']).to eq('true')
+      expect(response.parsed_body['data']['ManageRoles']).to eq('true')
     end
 
     context 'user without ManageRoles permission' do
diff --git a/spec/controllers/admin/roles_controller_spec.rb b/spec/controllers/admin/roles_controller_spec.rb
index 23e7d37fd62334313c9ec2b8fdd0f4debbecb1ff..0659ee4318670af87ccc0546cea8ddd5d013eb03 100644
--- a/spec/controllers/admin/roles_controller_spec.rb
+++ b/spec/controllers/admin/roles_controller_spec.rb
@@ -35,7 +35,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
 
       get :index
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(roles.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(roles.pluck(:id))
     end
 
     it 'returns the roles according to the query' do
@@ -44,14 +44,14 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       create_list(:role, 3)
 
       get :index, params: { search: 'role' }
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(search_roles.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(search_roles.pluck(:id))
     end
 
     it 'returns all roles if the search bar is empty' do
       create_list(:role, 5)
 
       get :index, params: { search: '' }
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(Role.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(Role.pluck(:id))
     end
 
     it 'excludes roles with a different provider' do
@@ -62,7 +62,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
 
       get :index
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(greenlight_roles.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(greenlight_roles.pluck(:id))
     end
 
     context 'user with ManageUser permission' do
@@ -79,7 +79,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
 
         get :index
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(roles.pluck(:id))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(roles.pluck(:id))
       end
     end
 
@@ -108,14 +108,14 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
 
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(roles.sort.reverse)
+        expect(response.parsed_body['data'].pluck('name')).to eq(roles.sort.reverse)
       end
 
       it 'orders the roles list by column and direction ASC' do
         get :index, params: { sort: { column: 'name', direction: 'ASC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(roles.sort)
+        expect(response.parsed_body['data'].pluck('name')).to eq(roles.sort)
       end
     end
   end
@@ -125,14 +125,14 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       valid_params = { name: 'CrazyRole' }
       expect { post :create, params: { role: valid_params } }.to change(Role, :count).by(1)
       expect(response).to have_http_status(:created)
-      expect(JSON.parse(response.body)['errors']).to be_nil
+      expect(response.parsed_body['errors']).to be_nil
     end
 
     it 'returns :bad_request for invalid params' do
       invalid_params = { name: '' }
       post :create, params: { not_role: invalid_params }
       expect(response).to have_http_status(:bad_request)
-      expect(JSON.parse(response.body)['errors']).not_to be_empty
+      expect(response.parsed_body['errors']).not_to be_empty
     end
 
     it 'calls create_role_permissions on role' do
@@ -161,7 +161,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       post :update, params: { id: role.id, role: valid_params }
       expect(role.reload.name).to eq(valid_params[:name])
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['errors']).to be_nil
+      expect(response.parsed_body['errors']).to be_nil
     end
 
     it 'returns :not_found for unfound roles' do
@@ -174,7 +174,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       invalid_params = { name: '' }
       post :update, params: { id: role.id, not_role: invalid_params }
       expect(response).to have_http_status(:bad_request)
-      expect(JSON.parse(response.body)['errors']).not_to be_empty
+      expect(response.parsed_body['errors']).not_to be_empty
     end
 
     context 'user without ManageRoles permission' do
@@ -196,7 +196,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       role = create(:role)
       get :show, params: { id: role.id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['id']).to eq(role.id)
+      expect(response.parsed_body['data']['id']).to eq(role.id)
     end
 
     it 'returns :not_found for unfound roles' do
diff --git a/spec/controllers/admin/server_recordings_controller_spec.rb b/spec/controllers/admin/server_recordings_controller_spec.rb
index 4a405537f09a14419c2d2c6bbe5f8d3da26598f3..cf54781e37de30d52a10e9e060b78562fb0ae600 100644
--- a/spec/controllers/admin/server_recordings_controller_spec.rb
+++ b/spec/controllers/admin/server_recordings_controller_spec.rb
@@ -35,7 +35,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
       get :index
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck(:id))
     end
 
     it 'returns the recordings according to the query' do
@@ -43,7 +43,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
       get :index, params: { search: 'recording' }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(search_recordings.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(search_recordings.pluck(:id))
     end
 
     it 'returns all recordings if the search query is empty' do
@@ -51,7 +51,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
       get :index, params: { search: '' }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck(:id))
     end
 
     it 'excludes rooms whose owners have a different provider' do
@@ -64,7 +64,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
       get :index
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recs.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(recs.pluck(:id))
     end
 
     context 'SuperAdmin accessing recordings for provider other than current provider' do
@@ -79,7 +79,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
         get :index
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck(:id))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck(:id))
       end
     end
 
@@ -105,14 +105,14 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
         get :index, params: { sort: { column: 'name', direction: 'DESC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(%w[P O O])
+        expect(response.parsed_body['data'].pluck('name')).to eq(%w[P O O])
       end
 
       it 'orders the recordings list by column and direction ASC' do
         get :index, params: { sort: { column: 'name', direction: 'ASC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(%w[O O P])
+        expect(response.parsed_body['data'].pluck('name')).to eq(%w[O O P])
       end
     end
   end
diff --git a/spec/controllers/admin/server_rooms_controller_spec.rb b/spec/controllers/admin/server_rooms_controller_spec.rb
index ec691cfc5449522c4b294438a3d7d8c54d1f14ad..b6d135b3be342241a1305c2af11f959cffe16375 100644
--- a/spec/controllers/admin/server_rooms_controller_spec.rb
+++ b/spec/controllers/admin/server_rooms_controller_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe Api::V1::Admin::ServerRoomsController, type: :controller do
       create_list(:room, 2, user_id: user_two.id)
 
       get :index
-      expect(JSON.parse(response.body)['data'].pluck('friendly_id'))
+      expect(response.parsed_body['data'].pluck('friendly_id'))
         .to match_array(Room.all.pluck(:friendly_id))
     end
 
@@ -56,7 +56,7 @@ RSpec.describe Api::V1::Admin::ServerRoomsController, type: :controller do
         create_list(:room, 2, user_id: user_two.id)
 
         get :index
-        expect(JSON.parse(response.body)['data'].pluck('friendly_id'))
+        expect(response.parsed_body['data'].pluck('friendly_id'))
           .to match_array(Room.all.pluck(:friendly_id))
       end
     end
@@ -69,7 +69,7 @@ RSpec.describe Api::V1::Admin::ServerRoomsController, type: :controller do
       create_list(:room, 2, user: user2)
 
       get :index
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(rooms.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(rooms.pluck(:id))
     end
 
     context 'user without ManageRooms permission' do
diff --git a/spec/controllers/admin/site_settings_controller_spec.rb b/spec/controllers/admin/site_settings_controller_spec.rb
index 67d122b51462a416f97b79a017ff2f6e123d0f94..5cd2ed948c1bf48e05f1c3308ea0c80a39c3bca6 100644
--- a/spec/controllers/admin/site_settings_controller_spec.rb
+++ b/spec/controllers/admin/site_settings_controller_spec.rb
@@ -36,10 +36,10 @@ RSpec.describe Api::V1::Admin::SiteSettingsController, type: :controller do
       get :index, params: { names: %w[settingA settingB] }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({
-                                                        'settingA' => 'valueA',
-                                                        'settingB' => 'valueB'
-                                                      })
+      expect(response.parsed_body['data']).to eq({
+                                                   'settingA' => 'valueA',
+                                                   'settingB' => 'valueB'
+                                                 })
     end
 
     context 'user without ManageSiteSettings permission' do
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb
index 3c93f7cae5831aaeb705a65a5083ffc657c5168b..d5e45968ef5569558cd7b31dbeb2fd971afd4cd4 100644
--- a/spec/controllers/admin/users_controller_spec.rb
+++ b/spec/controllers/admin/users_controller_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
       users = create_list(:user, 3, status: 'active') + [user, user_with_manage_users_permission]
       get :verified
       expect(response).to have_http_status(:ok)
-      response_user_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_user_ids = response.parsed_body['data'].pluck('id')
       expect(response_user_ids).to match_array(users.pluck(:id))
     end
 
@@ -43,7 +43,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
 
       get :verified
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(greenlight_users.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(greenlight_users.pluck(:id))
     end
   end
 
@@ -53,7 +53,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
 
       get :pending
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(users.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(users.pluck(:id))
     end
 
     context 'user without ManageUsers permission' do
@@ -74,7 +74,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
 
       get :banned
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(users.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(users.pluck(:id))
     end
 
     context 'user without ManageUsers permission' do
@@ -101,7 +101,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
         users = create_list(:user, 3, status: 'active') + [user, user_with_manage_users_permission]
         get :verified
         expect(response).to have_http_status(:ok)
-        response_user_ids = JSON.parse(response.body)['data'].pluck('id')
+        response_user_ids = response.parsed_body['data'].pluck('id')
         expect(response_user_ids).to match_array(users.pluck(:id))
       end
 
@@ -109,7 +109,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
         users = create_list(:user, 3, status: 'pending')
         get :pending
         expect(response).to have_http_status(:ok)
-        response_user_ids = JSON.parse(response.body)['data'].pluck('id')
+        response_user_ids = response.parsed_body['data'].pluck('id')
         expect(response_user_ids).to match_array(users.pluck(:id))
       end
 
@@ -117,7 +117,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
         users = create_list(:user, 3, status: 'banned')
         get :banned
         expect(response).to have_http_status(:ok)
-        response_user_ids = JSON.parse(response.body)['data'].pluck('id')
+        response_user_ids = response.parsed_body['data'].pluck('id')
         expect(response_user_ids).to match_array(users.pluck(:id))
       end
     end
diff --git a/spec/controllers/external_controller_spec.rb b/spec/controllers/external_controller_spec.rb
index 0f28fd71de5ef486745679d7317c5d79a8b573fd..1dc22e9b95d6e4228bb82c2ddccbe80872a25bf2 100644
--- a/spec/controllers/external_controller_spec.rb
+++ b/spec/controllers/external_controller_spec.rb
@@ -389,7 +389,7 @@ RSpec.describe ExternalController, type: :controller do
 
         expect(room.reload.online).to be(false)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)).to eq({})
+        expect(response.parsed_body).to eq({})
       end
 
       it 'increments a rooms recordings processing value if the meeting was recorded' do
@@ -409,7 +409,7 @@ RSpec.describe ExternalController, type: :controller do
 
         expect(room.online).to be(false)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)).to eq({})
+        expect(response.parsed_body).to eq({})
       end
     end
 
@@ -418,7 +418,7 @@ RSpec.describe ExternalController, type: :controller do
         get :meeting_ended, params: { meetingID: '404', recordingmarks: 'false' }
 
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)).to eq({})
+        expect(response.parsed_body).to eq({})
       end
     end
   end
diff --git a/spec/controllers/meetings_controller_spec.rb b/spec/controllers/meetings_controller_spec.rb
index 8b1976773c73de21afc95df2a3d21880c3bd47f8..48aeec11d84bdebcbc2b154cbf901949e4cdb335 100644
--- a/spec/controllers/meetings_controller_spec.rb
+++ b/spec/controllers/meetings_controller_spec.rb
@@ -48,7 +48,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
       post :start, params: { friendly_id: room.friendly_id }
 
       expect(response).to have_http_status(:created)
-      expect(JSON.parse(response.body)['data']).to eq('JOIN_URL')
+      expect(response.parsed_body['data']).to eq('JOIN_URL')
     end
 
     it 'cannot make call to MeetingStarter service for another room' do
@@ -81,7 +81,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
       post :start, params: { friendly_id: room.friendly_id }
 
       expect(response).to have_http_status(:created)
-      expect(JSON.parse(response.body)['data']).to eq('JOIN_URL')
+      expect(response.parsed_body['data']).to eq('JOIN_URL')
     end
 
     it 'returns an error if the user is not logged in' do
@@ -104,7 +104,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
         post :start, params: { friendly_id: room.friendly_id }
 
         expect(response).to have_http_status(:created)
-        expect(JSON.parse(response.body)['data']).to eq('JOIN_URL')
+        expect(response.parsed_body['data']).to eq('JOIN_URL')
       end
     end
 
@@ -134,7 +134,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
         post :start, params: { friendly_id: room.friendly_id }
 
         expect(response).to have_http_status(:created)
-        expect(JSON.parse(response.body)['data']).to eq('JOIN_URL')
+        expect(response.parsed_body['data']).to eq('JOIN_URL')
       end
     end
   end
@@ -146,7 +146,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
 
       post :status, params: { friendly_id: test_room.friendly_id, name: user.name }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
+      expect(response.parsed_body['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
     end
 
     it 'returns status false if the meeting is NOT running and the user is NOT authorized to start the meeting' do
@@ -156,7 +156,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
       post :status, params: { friendly_id: test_room.friendly_id, name: user.name }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'status' => false })
+      expect(response.parsed_body['data']).to eq({ 'status' => false })
     end
 
     it 'joins as viewer if no access code is required nor provided' do
@@ -192,7 +192,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
       post :status, params: { friendly_id: room.friendly_id, name: user.name }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
+      expect(response.parsed_body['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
     end
 
     context 'user is joining a shared room' do
@@ -360,7 +360,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
         post :status, params: { friendly_id: room.friendly_id, name: user.name }
 
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
+        expect(response.parsed_body['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
       end
 
       it 'doesnt start the meeting if its already running' do
@@ -373,7 +373,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
         post :status, params: { friendly_id: room.friendly_id, name: user.name }
 
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
+        expect(response.parsed_body['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
       end
     end
 
diff --git a/spec/controllers/recordings_controller_spec.rb b/spec/controllers/recordings_controller_spec.rb
index fd8a53c35871cb586ba413d96954ca0a639d5e5a..8814adedee962e66653d98e0c3063f1060c62fb3 100644
--- a/spec/controllers/recordings_controller_spec.rb
+++ b/spec/controllers/recordings_controller_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       get :index
 
       expect(response).to have_http_status(:ok)
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -43,7 +43,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       get :index
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to be_empty
+      expect(response.parsed_body['data']).to be_empty
     end
 
     it 'returns the recordings according to the query' do
@@ -56,7 +56,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create_list(:recording, 10)
 
       get :index, params: { search: 'greenlight' }
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -70,7 +70,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create_list(:recording, 10)
 
       get :index, params: { search: 'presentation' }
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -84,7 +84,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create_list(:recording, 10)
 
       get :index, params: { search: 'unpublished' }
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -93,7 +93,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create(:room, user:, recordings:)
 
       get :index, params: { search: '' }
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -108,14 +108,14 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
         get :index, params: { sort: { column: 'name', direction: 'DESC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(%w[C B A])
+        expect(response.parsed_body['data'].pluck('name')).to eq(%w[C B A])
       end
 
       it 'orders the recordings list by column and direction ASC' do
         get :index, params: { sort: { column: 'name', direction: 'ASC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(%w[A B C])
+        expect(response.parsed_body['data'].pluck('name')).to eq(%w[A B C])
       end
     end
   end
@@ -287,7 +287,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create_list(:room, 5, user:, recordings:)
 
       get :recordings_count
-      expect(JSON.parse(response.body)['data']).to be(5)
+      expect(response.parsed_body['data']).to be(5)
     end
   end
 
@@ -314,7 +314,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
           post :recording_url, params: { id: recording.record_id }
 
           expect(response).to have_http_status(:ok)
-          expect(JSON.parse(response.body)).to match_array ['https://test.com/screenshare', 'https://test.com/video']
+          expect(response.parsed_body).to match_array ['https://test.com/screenshare', 'https://test.com/video']
         end
 
         context 'Single playback format' do
@@ -328,7 +328,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
             post :recording_url, params: { id: recording.record_id }
 
             expect(response).to have_http_status(:ok)
-            expect(JSON.parse(response.body)).to eq ['https://test.com/screenshare']
+            expect(response.parsed_body).to eq ['https://test.com/screenshare']
           end
         end
       end
@@ -349,7 +349,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
           post :recording_url, params: { id: recording.record_id }
 
           expect(response).to have_http_status(:ok)
-          expect(JSON.parse(response.body)).to match_array recording.formats.pluck(:url)
+          expect(response.parsed_body).to match_array recording.formats.pluck(:url)
         end
       end
     end
@@ -370,7 +370,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
           post :recording_url, params: { id: recording.record_id, recording_format: 'screenshare' }
 
           expect(response).to have_http_status(:ok)
-          expect(JSON.parse(response.body)['data']).to eq 'https://test.com/screenshare'
+          expect(response.parsed_body['data']).to eq 'https://test.com/screenshare'
         end
 
         context 'Single playback format' do
@@ -384,7 +384,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
             post :recording_url, params: { id: recording.record_id, recording_format: 'screenshare' }
 
             expect(response).to have_http_status(:ok)
-            expect(JSON.parse(response.body)['data']).to eq 'https://test.com/screenshare/solo'
+            expect(response.parsed_body['data']).to eq 'https://test.com/screenshare/solo'
           end
         end
 
@@ -393,7 +393,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
             post :recording_url, params: { id: recording.record_id, recording_format: '404' }
 
             expect(response).to have_http_status(:not_found)
-            expect(JSON.parse(response.body)['data']).to be_blank
+            expect(response.parsed_body['data']).to be_blank
           end
         end
       end
@@ -416,7 +416,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
           post :recording_url, params: { id: recording.record_id, recording_format: target_format.recording_type }
 
           expect(response).to have_http_status(:ok)
-          expect(JSON.parse(response.body)['data']).to eq target_format.url
+          expect(response.parsed_body['data']).to eq target_format.url
         end
 
         context 'Inexistent format' do
@@ -424,7 +424,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
             post :recording_url, params: { id: recording.record_id, recording_format: '404' }
 
             expect(response).to have_http_status(:not_found)
-            expect(JSON.parse(response.body)['data']).to be_blank
+            expect(response.parsed_body['data']).to be_blank
           end
         end
       end
diff --git a/spec/controllers/reset_password_controller_spec.rb b/spec/controllers/reset_password_controller_spec.rb
index ea9c0349cec1e63c0ba003080202e3cb4bc92049..c307057823790a2b8f47a31aaf212c3efad3ed38 100644
--- a/spec/controllers/reset_password_controller_spec.rb
+++ b/spec/controllers/reset_password_controller_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe Api::V1::ResetPasswordController, type: :controller do
       expect(ActionMailer::MailDeliveryJob).to have_been_enqueued.at(:no_wait).exactly(:once).with('UserMailer', 'reset_password_email',
                                                                                                    'deliver_now', Hash)
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to be_empty
+      expect(response.parsed_body['data']).to be_empty
     end
 
     it 'returns :bad_request for invalid params' do
diff --git a/spec/controllers/room_settings_controller_spec.rb b/spec/controllers/room_settings_controller_spec.rb
index 16acf00a541b5c43bb814986cd2688dc65c97a3f..14674b69ae59d2bd71161e905544024be1c982da 100644
--- a/spec/controllers/room_settings_controller_spec.rb
+++ b/spec/controllers/room_settings_controller_spec.rb
@@ -42,7 +42,7 @@ RSpec.describe Api::V1::RoomSettingsController, type: :controller do
 
       get :show, params: { friendly_id: room.friendly_id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'setting' => 'value' })
+      expect(response.parsed_body['data']).to eq({ 'setting' => 'value' })
     end
 
     it 'returns the value for a shared user' do
@@ -51,7 +51,7 @@ RSpec.describe Api::V1::RoomSettingsController, type: :controller do
       sign_in_user(shared_user)
 
       get :show, params: { friendly_id: room.friendly_id }
-      expect(JSON.parse(response.body)['data']).to eq({ 'setting' => 'value' })
+      expect(response.parsed_body['data']).to eq({ 'setting' => 'value' })
     end
 
     context 'AuthN' do
diff --git a/spec/controllers/rooms_configurations_controller_spec.rb b/spec/controllers/rooms_configurations_controller_spec.rb
index 9d38dd8cb60ed881f713dbbc4e8c0b0fd35b6d28..159786c108d78616c9a261c40f804a16d8d70ce1 100644
--- a/spec/controllers/rooms_configurations_controller_spec.rb
+++ b/spec/controllers/rooms_configurations_controller_spec.rb
@@ -38,11 +38,11 @@ RSpec.describe Api::V1::RoomsConfigurationsController, type: :controller do
 
       get :index
 
-      expect(JSON.parse(response.body)['data']).to eq({
-                                                        'TRUE' => 'true',
-                                                        'FALSE' => 'false',
-                                                        'OPTIONAL' => 'optional'
-                                                      })
+      expect(response.parsed_body['data']).to eq({
+                                                   'TRUE' => 'true',
+                                                   'FALSE' => 'false',
+                                                   'OPTIONAL' => 'optional'
+                                                 })
       expect(response).to have_http_status(:ok)
     end
   end
@@ -55,7 +55,7 @@ RSpec.describe Api::V1::RoomsConfigurationsController, type: :controller do
     it 'returns the correct configuration value' do
       get :show, params: { name: 'record' }
 
-      expect(JSON.parse(response.body)['data']).to eq('false')
+      expect(response.parsed_body['data']).to eq('false')
 
       expect(response).to have_http_status(:ok)
     end
diff --git a/spec/controllers/rooms_controller_spec.rb b/spec/controllers/rooms_controller_spec.rb
index 747ab0b84041c76e7e66660b26eb3c0e2dea9d3b..469cbc074075ec385883e64602d20ac5b2d1da4e 100644
--- a/spec/controllers/rooms_controller_spec.rb
+++ b/spec/controllers/rooms_controller_spec.rb
@@ -35,14 +35,14 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
       rooms = create_list(:room, 3, user:) + shared_rooms
       get :index
       expect(response).to have_http_status(:ok)
-      response_room_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_room_ids = response.parsed_body['data'].pluck('id')
       expect(response_room_ids).to match_array(rooms.pluck(:id))
     end
 
     it 'no rooms for current_user should return empty list' do
       get :index
       expect(response).to have_http_status(:ok)
-      response_room_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_room_ids = response.parsed_body['data'].pluck('id')
       expect(response_room_ids).to be_empty
     end
 
@@ -54,14 +54,14 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
         create_list(:room, 2, user:)
 
         get :index, params: { search: 'room' }
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(searched_rooms.pluck(:id))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(searched_rooms.pluck(:id))
       end
 
       it 'returns all rooms when no search query was given' do
         create_list(:room, 5, user:)
 
         get :index, params: { search: '' }
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(user.rooms.pluck(:id))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(user.rooms.pluck(:id))
       end
     end
   end
@@ -71,13 +71,13 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
       room = create(:room, user:)
       get :show, params: { friendly_id: room.friendly_id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['id']).to eq(room.id)
+      expect(response.parsed_body['data']['id']).to eq(room.id)
     end
 
     it 'returns :not_found if the room doesnt exist' do
       get :show, params: { friendly_id: 'invalid_friendly_id' }
       expect(response).to have_http_status(:not_found)
-      expect(JSON.parse(response.body)['data']).to be_nil
+      expect(response.parsed_body['data']).to be_nil
     end
 
     it 'user cannot see another users room without ManageRooms permission' do
@@ -99,7 +99,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
       it 'allows a user who the room is shared with to view the room' do
         get :show, params: { friendly_id: room.friendly_id }
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data']['id']).to eq(room.id)
+        expect(response.parsed_body['data']['id']).to eq(room.id)
       end
     end
   end
@@ -129,19 +129,19 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       get :public_show, params: { friendly_id: room.friendly_id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['name']).to eq(room.name)
-      expect(JSON.parse(response.body)['data']['require_authentication']).to be(true)
-      expect(JSON.parse(response.body)['data']['viewer_access_code']).to be(true)
-      expect(JSON.parse(response.body)['data']['moderator_access_code']).to be(false)
-      expect(JSON.parse(response.body)['data']['anyone_join_as_moderator']).to be(true)
-      expect(JSON.parse(response.body)['data']['owner_name']).to eq(user.name)
-      expect(JSON.parse(response.body)['data']['owner_avatar']).to be_present
+      expect(response.parsed_body['data']['name']).to eq(room.name)
+      expect(response.parsed_body['data']['require_authentication']).to be(true)
+      expect(response.parsed_body['data']['viewer_access_code']).to be(true)
+      expect(response.parsed_body['data']['moderator_access_code']).to be(false)
+      expect(response.parsed_body['data']['anyone_join_as_moderator']).to be(true)
+      expect(response.parsed_body['data']['owner_name']).to eq(user.name)
+      expect(response.parsed_body['data']['owner_avatar']).to be_present
     end
 
     it 'returns :not_found if the room doesnt exist' do
       get :public_show, params: { friendly_id: 'invalid_friendly_id' }
       expect(response).to have_http_status(:not_found)
-      expect(JSON.parse(response.body)['data']).to be_nil
+      expect(response.parsed_body['data']).to be_nil
     end
   end
 
@@ -301,7 +301,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
       recordings = create_list(:recording, 5, room: room1)
       create_list(:recording, 5, room: room2)
       get :recordings, params: { friendly_id: room1.friendly_id }
-      recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      recording_ids = response.parsed_body['data'].pluck('id')
       expect(response).to have_http_status(:ok)
       expect(recording_ids).to match_array(recordings.pluck(:id))
     end
@@ -309,7 +309,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
     it 'returns an empty array if the room has no recordings' do
       room1 = create(:room, user:, friendly_id: 'friendly_id_1')
       get :recordings, params: { friendly_id: room1.friendly_id }
-      recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      recording_ids = response.parsed_body['data'].pluck('id')
       expect(response).to have_http_status(:ok)
       expect(recording_ids).to be_empty
     end
@@ -324,7 +324,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       get :recordings, params: { friendly_id: room.friendly_id }
 
-      recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      recording_ids = response.parsed_body['data'].pluck('id')
       expect(response).to have_http_status(:ok)
       expect(recording_ids).to match_array(recordings.pluck(:id))
     end
@@ -353,7 +353,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
         get :public_recordings, params: { friendly_id: room.friendly_id }
 
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data']).to match_array(expected_response)
+        expect(response.parsed_body['data']).to match_array(expected_response)
       end
     end
 
@@ -370,9 +370,9 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       def expect_response_to_have(page:, pages:, recordings:)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck('id'))
-        expect(JSON.parse(response.body)['meta']['pages']).to eq(pages)
-        expect(JSON.parse(response.body)['meta']['page']).to eq(page)
+        expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck('id'))
+        expect(response.parsed_body['meta']['pages']).to eq(pages)
+        expect(response.parsed_body['meta']['page']).to eq(page)
       end
 
       context 'First page' do
@@ -427,7 +427,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       def expect_response_to_have_ordered(recordings:)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to eq(recordings.pluck('id'))
+        expect(response.parsed_body['data'].pluck('id')).to eq(recordings.pluck('id'))
       end
 
       describe 'Sort by name' do
@@ -493,7 +493,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       def expect_response_to_match(recordings:)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck('id'))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck('id'))
       end
 
       describe 'Matched by name' do
@@ -539,7 +539,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
         get :public_recordings, params: { friendly_id: '404' }
 
         expect(response).to have_http_status(:not_found)
-        expect(JSON.parse(response.body)['data']).to be_blank
+        expect(response.parsed_body['data']).to be_blank
       end
     end
   end
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index 06bbabc24a5ee4933ce047ce6ae984c7e5cfafcd..e2202d269981397f37c348a46177ecd0462bef2b 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -64,8 +64,8 @@ RSpec.describe Api::V1::SessionsController, type: :controller do
         }
       }
 
-      expect(JSON.parse(response.body)['data']).to eq(unverified_user.id)
-      expect(JSON.parse(response.body)['errors']).to eq('UnverifiedUser')
+      expect(response.parsed_body['data']).to eq(unverified_user.id)
+      expect(response.parsed_body['errors']).to eq('UnverifiedUser')
     end
 
     it 'returns BannedUser error if the user is banned' do
@@ -78,7 +78,7 @@ RSpec.describe Api::V1::SessionsController, type: :controller do
         }
       }
 
-      expect(JSON.parse(response.body)['errors']).to eq('BannedUser')
+      expect(response.parsed_body['errors']).to eq('BannedUser')
     end
 
     it 'returns Pending error if the user is banned' do
@@ -91,7 +91,7 @@ RSpec.describe Api::V1::SessionsController, type: :controller do
         }
       }
 
-      expect(JSON.parse(response.body)['errors']).to eq('PendingUser')
+      expect(response.parsed_body['errors']).to eq('PendingUser')
     end
 
     it 'logs in with greenlight account before bn account' do
diff --git a/spec/controllers/shared_accesses_controller_spec.rb b/spec/controllers/shared_accesses_controller_spec.rb
index e48f1fce701c90bb2d6b9817f5765c2862918bdb..1511f8108c56c9e3c13755dfa3c99a10ca3491aa 100644
--- a/spec/controllers/shared_accesses_controller_spec.rb
+++ b/spec/controllers/shared_accesses_controller_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       room.shared_users = shared_users
 
       get :show, params: { friendly_id: room.friendly_id, search: '' }
-      shared_user_ids = JSON.parse(response.body)['data'].pluck('id')
+      shared_user_ids = response.parsed_body['data'].pluck('id')
       expect(shared_user_ids).to match_array(shared_users.pluck(:id))
       expect(shared_user_ids).not_to include(unshared_users.pluck(:id))
     end
@@ -62,7 +62,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       room.shared_users << searched_users
 
       get :show, params: { friendly_id: room.friendly_id, search: 'John Doe' }
-      response_users_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_users_ids = response.parsed_body['data'].pluck('id')
       expect(response_users_ids).to match_array(searched_users.pluck(:id))
     end
 
@@ -74,7 +74,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       room.shared_users = shared_users + [shared_user]
 
       get :show, params: { friendly_id: room.friendly_id, search: '' }
-      shared_user_ids = JSON.parse(response.body)['data'].pluck('id')
+      shared_user_ids = response.parsed_body['data'].pluck('id')
       expect(shared_user_ids).to match_array((shared_users + [shared_user]).pluck(:id))
     end
   end
@@ -85,7 +85,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       shareable_users << user
 
       get :shareable_users, params: { friendly_id: room.friendly_id, search: '' }
-      expect(JSON.parse(response.body)['data']).to be_empty
+      expect(response.parsed_body['data']).to be_empty
     end
 
     it 'does not return any users if the search params has less than 3 characters' do
@@ -93,7 +93,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       shareable_users << user
 
       get :shareable_users, params: { friendly_id: room.friendly_id, search: 'Jo' }
-      expect(JSON.parse(response.body)['data']).to be_empty
+      expect(response.parsed_body['data']).to be_empty
     end
 
     it 'returns the users that the room can be shared to' do
@@ -101,7 +101,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       shareable_users = create_list(:user, 5, name: 'John Doe')
 
       get :shareable_users, params: { friendly_id: room.friendly_id, search: 'John Doe' }
-      response_users_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_users_ids = response.parsed_body['data'].pluck('id')
       expect(response_users_ids).to match_array(shareable_users.pluck(:id))
     end
 
@@ -110,7 +110,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       shareable_users = create_list(:user, 5, name: 'Jane Doe')
 
       get :shareable_users, params: { friendly_id: room.friendly_id, search: 'Jane Doe' }
-      response_users_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_users_ids = response.parsed_body['data'].pluck('id')
       expect(response_users_ids).to match_array(shareable_users.pluck(:id))
     end
 
@@ -120,7 +120,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
         create(:user, :without_shared_list_permission, name: 'John Doe')
 
         get :shareable_users, params: { friendly_id: room.friendly_id, search: 'John Doe' }
-        response_users_ids = JSON.parse(response.body)['data'].pluck('id')
+        response_users_ids = response.parsed_body['data'].pluck('id')
         expect(response_users_ids).to match_array([])
       end
     end
diff --git a/spec/controllers/site_settings_controller_spec.rb b/spec/controllers/site_settings_controller_spec.rb
index 8b2faf14692df01d95c14be9013269ba16de9a10..b8bd10d9d0e40699d5ab33cd5241d7e7ea39c002 100644
--- a/spec/controllers/site_settings_controller_spec.rb
+++ b/spec/controllers/site_settings_controller_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe Api::V1::SiteSettingsController, type: :controller do
       get :index, params: { names: 'SettingName' }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq('false')
+      expect(response.parsed_body['data']).to eq('false')
     end
 
     it 'calls SettingGetter and returns multiple values' do
@@ -44,7 +44,7 @@ RSpec.describe Api::V1::SiteSettingsController, type: :controller do
       get :index, params: { names: %w[Uno Dos Tres] }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'Uno' => 1, 'Dos' => 2, 'Tres' => 3 })
+      expect(response.parsed_body['data']).to eq({ 'Uno' => 1, 'Dos' => 2, 'Tres' => 3 })
     end
 
     it 'returns forbidden if trying to access a forbidden setting' do
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index 7249637a5632d7e2fae92cc081e95ba7c1dd6086..7c61036e82baa83ae9f4c6756b6e9640b63270bc 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -58,7 +58,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
         expect { post :create, params: user_params }.to change(User, :count).from(0).to(1)
 
         expect(response).to have_http_status(:created)
-        expect(JSON.parse(response.body)['errors']).to be_nil
+        expect(response.parsed_body['errors']).to be_nil
       end
 
       it 'assigns the User role to the user' do
@@ -170,7 +170,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
 
         expect(ActionMailer::MailDeliveryJob).not_to have_been_enqueued
         expect(response).to have_http_status(:bad_request)
-        expect(JSON.parse(response.body)['errors']).to eq(Rails.configuration.custom_error_msgs[:record_invalid])
+        expect(response.parsed_body['errors']).to eq(Rails.configuration.custom_error_msgs[:record_invalid])
       end
 
       context 'Duplicated email' do
@@ -184,7 +184,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
 
           expect(ActionMailer::MailDeliveryJob).not_to have_been_enqueued
           expect(response).to have_http_status(:bad_request)
-          expect(JSON.parse(response.body)['errors']).to eq(Rails.configuration.custom_error_msgs[:email_exists])
+          expect(response.parsed_body['errors']).to eq(Rails.configuration.custom_error_msgs[:email_exists])
         end
       end
     end
@@ -209,7 +209,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
 
         expect(User.find_by(email: user_params[:email]).role).to eq(autobots)
         expect(response).to have_http_status(:created)
-        expect(JSON.parse(response.body)['errors']).to be_nil
+        expect(response.parsed_body['errors']).to be_nil
       end
     end
 
@@ -228,7 +228,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
           expect { post :create, params: user_params }.to change(User, :count).from(0).to(1)
 
           expect(response).to have_http_status(:created)
-          expect(JSON.parse(response.body)['errors']).to be_nil
+          expect(response.parsed_body['errors']).to be_nil
         end
 
         it 'deletes an invitation after using it' do
@@ -244,14 +244,14 @@ RSpec.describe Api::V1::UsersController, type: :controller do
           expect { post :create, params: user_params }.to change(User, :count).by(1)
 
           expect(response).to have_http_status(:created)
-          expect(JSON.parse(response.body)['errors']).to be_nil
+          expect(response.parsed_body['errors']).to be_nil
         end
 
         it 'returns an InviteInvalid error if no invite is passed' do
           expect { post :create, params: user_params }.not_to change(User, :count)
 
           expect(response).to have_http_status(:bad_request)
-          expect(JSON.parse(response.body)['errors']).to eq(Rails.configuration.custom_error_msgs[:invite_token_invalid])
+          expect(response.parsed_body['errors']).to eq(Rails.configuration.custom_error_msgs[:invite_token_invalid])
         end
 
         it 'returns an InviteInvalid error if the token is wrong' do
@@ -259,7 +259,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
           expect { post :create, params: user_params }.not_to change(User, :count)
 
           expect(response).to have_http_status(:bad_request)
-          expect(JSON.parse(response.body)['errors']).to eq(Rails.configuration.custom_error_msgs[:invite_token_invalid])
+          expect(response.parsed_body['errors']).to eq(Rails.configuration.custom_error_msgs[:invite_token_invalid])
         end
       end
 
@@ -287,8 +287,8 @@ RSpec.describe Api::V1::UsersController, type: :controller do
         expect { post :create, params: user_params }.not_to change(User, :count)
 
         expect(response).to have_http_status(:forbidden)
-        expect(JSON.parse(response.body)['data']).to be_blank
-        expect(JSON.parse(response.body)['errors']).not_to be_nil
+        expect(response.parsed_body['data']).to be_blank
+        expect(response.parsed_body['errors']).not_to be_nil
       end
     end
   end
@@ -301,7 +301,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
     it 'returns a user if id is valid' do
       get :show, params: { id: user.id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['id']).to eq(user.id)
+      expect(response.parsed_body['data']['id']).to eq(user.id)
     end
   end