diff --git a/contracts/migrations/0041_alter_contract_agreement_url_and_more.py b/contracts/migrations/0041_alter_contract_agreement_url_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..182e80d2e92e5efb6c0d155be57ce6518c922ded
--- /dev/null
+++ b/contracts/migrations/0041_alter_contract_agreement_url_and_more.py
@@ -0,0 +1,45 @@
+# Generated by Django 4.1.4 on 2023-04-12 09:21
+
+from django.db import migrations
+
+import contracts.models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("contracts", "0040_alter_contract_agreement_url_and_more"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="contract",
+            name="agreement_url",
+            field=contracts.models.SubdomainValidatedURLField(
+                blank=True,
+                help_text="Běžně odkaz na fórum. Využívá se např. u koaličních smluv. Musí začínat <code>https</code>.",
+                max_length=256,
+                null=True,
+                verbose_name="Odkaz na schválení",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="contract",
+            name="tender_url",
+            field=contracts.models.SubdomainValidatedURLField(
+                blank=True,
+                help_text='Běžně odkaz na <a href="https://forum.pirati.cz/viewforum.php?f=572">fórum</a>. Musí začínat <code>https</code>. a být pod doménou <code>pirati.cz</code>.',
+                max_length=256,
+                null=True,
+                verbose_name="Odkaz na výběrové řízení",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="contractintent",
+            name="url",
+            field=contracts.models.SubdomainValidatedURLField(
+                help_text="Musí začínat <code>https</code>.",
+                max_length=256,
+                verbose_name="Odkaz",
+            ),
+        ),
+    ]
diff --git a/contracts/migrations/0042_alter_contract_agreement_url_and_more.py b/contracts/migrations/0042_alter_contract_agreement_url_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..f874792f6a7031d8ab80c13aa6a0238ac97618db
--- /dev/null
+++ b/contracts/migrations/0042_alter_contract_agreement_url_and_more.py
@@ -0,0 +1,45 @@
+# Generated by Django 4.1.4 on 2023-04-12 09:22
+
+from django.db import migrations
+
+import contracts.models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("contracts", "0041_alter_contract_agreement_url_and_more"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="contract",
+            name="agreement_url",
+            field=contracts.models.SubdomainValidatedURLField(
+                blank=True,
+                help_text="Běžně odkaz na fórum. Využívá se např. u koaličních smluv. Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>.",
+                max_length=256,
+                null=True,
+                verbose_name="Odkaz na schválení",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="contract",
+            name="tender_url",
+            field=contracts.models.SubdomainValidatedURLField(
+                blank=True,
+                help_text='Běžně odkaz na <a href="https://forum.pirati.cz/viewforum.php?f=572">fórum</a>. Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>.',
+                max_length=256,
+                null=True,
+                verbose_name="Odkaz na výběrové řízení",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="contractintent",
+            name="url",
+            field=contracts.models.SubdomainValidatedURLField(
+                help_text="Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>.",
+                max_length=256,
+                verbose_name="Odkaz",
+            ),
+        ),
+    ]
diff --git a/contracts/models.py b/contracts/models.py
index b68ea27ee06a9e888dfd5a98bd7659427114230b..de1060e3085556a3d31a89546f3e47593d77f9f4 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -5,7 +5,7 @@ import typing
 
 from django.conf import settings
 from django.core.exceptions import ValidationError
-from django.core.validators import URLValidator
+from django.core.validators import RegexValidator, URLValidator
 from django.db import models
 from django.db.models.signals import post_save
 from django.dispatch import receiver
@@ -17,6 +17,13 @@ from shared.models import NameStrMixin
 from users.models import User
 
 
+class SubdomainValidatedURLField(models.URLField):
+    validators = [
+        URLValidator(schemes=("https",)),
+        RegexValidator(regex=r"https:\/\/.*\.pirati.cz(\/|$).*"),
+    ]
+
+
 class OwnPermissionsMixin(models.Model):
     class Meta:
         abstract = True
@@ -566,27 +573,25 @@ class Contract(NameStrMixin, models.Model):
         verbose_name="Stav fyzického dokumentu",
     )
 
-    tender_url = models.URLField(
+    tender_url = SubdomainValidatedURLField(
         max_length=256,
         blank=True,
         null=True,
-        validators=(URLValidator(schemes=("https",)),),
         verbose_name="Odkaz na výběrové řízení",
         help_text=mark_safe(
             'Běžně odkaz na <a href="https://forum.pirati.cz/viewforum.php?f=572">fórum</a>. '
-            "Musí začínat <code>https</code>."
+            "Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>."
         ),
     )
 
-    agreement_url = models.URLField(
+    agreement_url = SubdomainValidatedURLField(
         max_length=256,
         blank=True,
         null=True,
-        validators=(URLValidator(schemes=("https",)),),
         verbose_name="Odkaz na schválení",
         help_text=mark_safe(
             "Běžně odkaz na fórum. Využívá se např. u koaličních smluv. "
-            "Musí začínat <code>https</code>."
+            "Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>."
         ),
     )  # WARNING: Dependent on the type!
 
@@ -996,11 +1001,12 @@ class ContractIntent(NameStrMixin, models.Model):
         verbose_name="Jméno",
     )
 
-    url = models.URLField(
+    url = SubdomainValidatedURLField(
         max_length=256,
         verbose_name="Odkaz",
-        validators=(URLValidator(schemes=("https",)),),
-        help_text=mark_safe("Musí začínat <code>https</code>."),
+        help_text=mark_safe(
+            "Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>."
+        ),
     )
 
     contract = models.ForeignKey(