diff --git a/arkindex/process/serializers/workers.py b/arkindex/process/serializers/workers.py
index 9d513b48388e4eee3bac8d3043db43cf0f059e95..24c6bb162acf27713a002442ce0aaddd1e4c6eda 100644
--- a/arkindex/process/serializers/workers.py
+++ b/arkindex/process/serializers/workers.py
@@ -254,9 +254,10 @@ class WorkerVersionSerializer(serializers.ModelSerializer):
         read_only_fields = ("revision_url", "version")
 
     def validate_tag(self, tag):
+        if tag is None:
+            return
         worker = self.instance.worker if self.instance else self.context["worker"]
-        existing_version = worker.versions.filter(tag=tag).exists()
-        if existing_version:
+        if worker.versions.filter(tag=tag).exists():
             raise ValidationError("A version already exists for this worker with this tag.")
         return tag
 
@@ -306,6 +307,12 @@ class WorkerVersionCreateSerializer(WorkerVersionSerializer):
             raise ValidationError(str(e))
         return docker_image_iid
 
+    def validate_revision_url(self, revision_url):
+        worker = self.instance.worker if self.instance else self.context["worker"]
+        if worker.versions.using("default").filter(revision_url=revision_url).exists():
+            raise ValidationError("A version already exists for this worker with this revision_url.")
+        return revision_url
+
     def validate(self, data):
         super().validate(data)
         errors = defaultdict(list)
diff --git a/arkindex/process/tests/test_workers.py b/arkindex/process/tests/test_workers.py
index 3263cba473c7caac705dabafb54b7093b7f4c0b8..96b792003d1b233a5302818fa1dc281d3842a158 100644
--- a/arkindex/process/tests/test_workers.py
+++ b/arkindex/process/tests/test_workers.py
@@ -64,7 +64,6 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
     def setUp(self):
         super().setUp()
         self.version_1 = WorkerVersion.objects.get(worker=self.worker_reco)
-        self.version_1.gpu_usage = FeatureUsage.Disabled
         self.version_2 = self.worker_dla.versions.get()
         self.version_custom = self.worker_custom.versions.get()
 
@@ -1226,7 +1225,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
         self.worker_reco.archived = datetime.now(timezone.utc)
         self.worker_reco.save()
 
-        with self.assertNumQueries(2):
+        with self.assertNumQueries(3):
             response = self.client.post(
                 reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}),
                 data={
@@ -1298,7 +1297,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
         self.worker_dla.repository_url = "https://gitlab.com/NERV/eva"
         self.worker_dla.save()
 
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(7):
             response = self.client.post(
                 reverse("api:worker-versions", kwargs={"pk": str(self.worker_dla.id)}),
                 data={"revision_url": "https://gitlab.com/NERV/eva/commit/eva-01", "configuration": {"test": "test2"}, "model_usage": FeatureUsage.Required.value},
@@ -1404,8 +1403,24 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
         self.assertEqual(data["gpu_usage"], "disabled")
         self.assertEqual(data["model_usage"], FeatureUsage.Required.value)
 
+    def test_create_version_duplicate_revision_url(self):
+        self.version_1.revision_url = "https://gitlab.com/NERV/eva/commit/eva-01"
+        self.version_1.version = None
+        self.version_1.save()
+        response = self.client.post(
+            reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}),
+            data={
+                "configuration": {"test": "test2"},
+                "revision_url": "https://gitlab.com/NERV/eva/commit/eva-01",
+            },
+            format="json",
+            HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
+        )
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+        self.assertDictEqual(response.json(), {"revision_url": ["A version already exists for this worker with this revision_url."]})
+
     def test_create_version_with_tag(self):
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(7):
             response = self.client.post(
                 reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}),
                 data={
@@ -1433,7 +1448,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
         self.version_1.tag = "eva-01"
         self.version_1.save()
 
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.post(
                 reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}),
                 data={"configuration": {"test": "test2"}, "revision_url": "https://gitlab.com/NERV/eva/commit/eva-01", "tag": "eva-01"},
@@ -1444,7 +1459,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
         self.assertDictEqual(response.json(), {"tag": ["A version already exists for this worker with this tag."]})
 
     def test_create_version_empty_tag(self):
-        with self.assertNumQueries(2):
+        with self.assertNumQueries(3):
             response = self.client.post(
                 reverse("api:worker-versions", kwargs={"pk": str(self.worker_reco.id)}),
                 data={"configuration": {"test": "test2"}, "revision_url": "https://gitlab.com/NERV/eva/commit/eva-01", "tag": ""},