diff --git a/changelogs/unreleased/fix-users-api-500-error.yml b/changelogs/unreleased/fix-users-api-500-error.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ac9e7a480d8b648efe71345732112e7141b28cc7
--- /dev/null
+++ b/changelogs/unreleased/fix-users-api-500-error.yml
@@ -0,0 +1,4 @@
+---
+title: Fix 500 errors when creating a user with identity via API
+merge_request: 8442
+author:
diff --git a/lib/api/users.rb b/lib/api/users.rb
index de07fbf59fc25efafd8b922010aef614d22be44e..0db76ec78773fbfc44edee037f973edcd60d610e 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -91,10 +91,11 @@ module API
         authenticated_as_admin!
 
         # Filter out params which are used later
-        identity_attrs = params.slice(:provider, :extern_uid)
+        user_params = declared_params(include_missing: false)
+        identity_attrs = user_params.slice(:provider, :extern_uid)
         confirm = params.delete(:confirm)
 
-        user = User.new(declared_params(include_missing: false))
+        user = User.new(user_params.except(:extern_uid, :provider))
         user.skip_confirmation! unless confirm
 
         if identity_attrs.any?
@@ -159,11 +160,7 @@ module API
           end
         end
 
-        # Delete already handled parameters
-        user_params.delete(:extern_uid)
-        user_params.delete(:provider)
-
-        if user.update_attributes(user_params)
+        if user.update_attributes(user_params.except(:extern_uid, :provider))
           present user, with: Entities::UserPublic
         else
           render_validation_error!(user)
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index 45b7988a05468d731eeebd2c3d8cb1ce0310c0b6..2c2e17eddb047dae954257aef24be1952a220d01 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -265,6 +265,14 @@ describe API::Users, api: true  do
         expect(response).to have_http_status(409)
         expect(json_response['message']).to eq('Username has already been taken')
       end
+
+      it 'creates user with new identity' do
+        post api("/users", admin), attributes_for(:user, provider: 'github', extern_uid: '67890')
+
+        expect(response).to have_http_status(201)
+        expect(json_response['identities'].first['extern_uid']).to eq('67890')
+        expect(json_response['identities'].first['provider']).to eq('github')
+      end
     end
   end