diff --git a/src/consents/serializers.py b/src/consents/serializers.py
index a89b135684f3ed32a74022da4e4e182993d2e1fa..e6c07494e1b57d3c0d318a399d2826e314517791 100644
--- a/src/consents/serializers.py
+++ b/src/consents/serializers.py
@@ -92,4 +92,7 @@ class SaveUserConsentSerializer(serializers.Serializer):
 class CreateUserSerializer(serializers.Serializer):
     email = serializers.CharField()
     first_name = serializers.CharField()
-    last_name = serializers.CharField()
\ No newline at end of file
+    last_name = serializers.CharField()
+
+class CreateUserShibbolethSerializer(serializers.Serializer):
+    email = serializers.CharField()
\ No newline at end of file
diff --git a/src/consents/urls.py b/src/consents/urls.py
index d89f1330440be404de5f7c62de06fe38b268ad73..223c00d82e464671d49226c5f2ef9c08b5892ead 100644
--- a/src/consents/urls.py
+++ b/src/consents/urls.py
@@ -8,6 +8,7 @@ urlpatterns = [
     path('provider/create', views.CreateProviderConsentView.as_view()),
     path('user/save', views.SaveUserConsentView.as_view()),
     path('user/create', views.CreateUserConsentView.as_view()),
+    path('user/create-via-shibboleth', views.CreateUserConsentViaShibbolethView.as_view()),
     path('user/status', views.GetUserConsentStatusView.as_view()),
     path('user/analytics-tokens', views.GetUserConsentAnalyticsTokens.as_view()),
     path('user/analytics-tokens/consent', views.SaveUserConsentAnalyticsTokens.as_view()),
diff --git a/src/consents/views.py b/src/consents/views.py
index 852a030908c86a2818a15137984c8dbb0273b524..674c0b9dd2f64f98b23c5aa322107bcbc34a73ed 100644
--- a/src/consents/views.py
+++ b/src/consents/views.py
@@ -1,4 +1,6 @@
 import json
+import string
+import random
 import os
 import secrets
 
@@ -15,12 +17,12 @@ from rest_framework.views import APIView
 from backend.role_permission import IsProvider
 from consents.serializers import (ProviderSchemaSerializer,
                                   ProvidersSerializer,
-                                  SaveUserConsentSerializer, CreateUserSerializer)
+                                  SaveUserConsentSerializer, CreateUserSerializer, CreateUserShibbolethSerializer)
 from providers.models import AnalyticsToken, AnalyticsTokenVerb, Provider, ProviderAuthorization, ProviderSchema
 from providers.serializers import (AnalyticsTokenSerializer, ConsentUserVerbThirdPartySerializer,
                                    GetUsersConsentsThirdPartySerializer)
 from users.models import CustomUser
-from xapi.views import shib_connector_resolver
+from xapi.views import shib_connector_resolver, shib_connector_resolver_to_pairwaise_id
 
 from .models import UserConsents
 
@@ -352,7 +354,6 @@ class CreateUserConsentView(APIView):
         serializer.is_valid(raise_exception=True) 
         
         email = serializer.validated_data["email"]
-        email = shib_connector_resolver(email=email, provider=provider)
 
         if CustomUser.objects.filter(email=email).first() is None:
            user = CustomUser.objects.create(
@@ -368,6 +369,40 @@ class CreateUserConsentView(APIView):
                     safe=False,
                     status=status.HTTP_200_OK,
                 )
+    
+class CreateUserConsentViaShibbolethView(APIView):
+    
+    def post(self, request):
+        application_token = request.headers.get("Authorization", "").split("Basic ")[-1]
+        provider = ProviderAuthorization.objects.filter(key=application_token).first()
+        if provider is None:
+            return JsonResponse(
+                {"message": "invalid access token"},
+                safe=False,
+                status=status.HTTP_401_UNAUTHORIZED,
+            )
+       
+        serializer = CreateUserShibbolethSerializer(data=request.data, many=True)
+        serializer.is_valid(raise_exception=True) 
+        
+        email = serializer.validated_data["email"]
+        shib_id = shib_connector_resolver_to_pairwaise_id(email=email, provider=provider)
+
+        if CustomUser.objects.filter(uid=shib_id).first() is None:
+           user = CustomUser.objects.create(
+                uid=shib_id, # this is the pairwaise id 
+                email=''.join(random.choices(string.ascii_uppercase + string.digits, k=8)) + "@manual-created.polaris",
+                first_name=''.join(random.choices(string.ascii_uppercase + string.digits, k=8)),
+                last_name=''.join(random.choices(string.ascii_uppercase + string.digits, k=8))
+           )
+
+        return JsonResponse(
+                    {
+                        "user": user,
+                    },
+                    safe=False,
+                    status=status.HTTP_200_OK,
+                )
 
 class SaveUserConsentView(APIView):
     """
diff --git a/src/xapi/views.py b/src/xapi/views.py
index 15452ec9f415e71c4b9dbf5e4b912d913be715a1..0361f1f55fe97c8dae4d018c73080070ad658c31 100644
--- a/src/xapi/views.py
+++ b/src/xapi/views.py
@@ -50,7 +50,7 @@ def anonymize_statement(x_api_statement):
     x_api_statement.set("actor", {"name": "anonymous", "mbox":  settings.ANON_HASH_PREFIX + ": " + hashed_actor})
 
 
-def shib_connector_resolver(email, provider):
+def shib_connector_resolver_to_pairwaise_id(email, provider):
     if settings.SHIB_ID_CONNECTOR_ENABLED:
       r = None
       if settings.SHIB_ID_CONNECTOR_CACHE:
@@ -82,6 +82,12 @@ def shib_connector_resolver(email, provider):
              r.set(email,shib_id)
              r.expires(email,settings.SHIB_ID_CONNECTOR_CACHE_MAX_AGE*60)
 
+      return shib_id
+    return ""
+
+def shib_connector_resolver(email, provider):
+    if settings.SHIB_ID_CONNECTOR_ENABLED:
+      shib_id = shib_connector_resolver_to_pairwaise_id(email=email, provider=provider)
       # Shib-ID is here the pairwaise id,so we need to resolve to the user email
       try:
          user = CustomUser.objects.get(shibboleth_connector_identifier=shib_id)