diff --git a/program/serializers.py b/program/serializers.py
index e151996479f027c8987d926c3c41b978d2f29c79..deb5e16348a58dd183d7b14119f119580773f57a 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -28,6 +28,7 @@ from rest_framework.permissions import exceptions
 from django.conf import settings
 from django.contrib.auth.models import User
 from django.core.exceptions import ObjectDoesNotExist
+from django.db import IntegrityError
 from django.utils import text, timezone
 from program.models import (
     Category,
@@ -1023,22 +1024,27 @@ class NoteSerializer(serializers.ModelSerializer):
         # optional foreign key
         validated_data["image"] = validated_data.pop("image", None)
 
-        note = Note.objects.create(
-            created_by=self.context.get("request").user.username,
-            **validated_data,
-        )
-
-        note.contributors.set(contributors)
-        note.language.set(language)
-        note.topic.set(topic)
+        try:
+            note = Note.objects.create(
+                created_by=self.context.get("request").user.username,
+                **validated_data,
+            )
+        except IntegrityError:
+            raise exceptions.ValidationError(
+                code="duplicate", detail="note for this timeslot already exists."
+            )
+        else:
+            note.contributors.set(contributors)
+            note.language.set(language)
+            note.topic.set(topic)
 
-        # optional nested objects
-        for link_data in links_data:
-            NoteLink.objects.create(note=note, **link_data)
+            # optional nested objects
+            for link_data in links_data:
+                NoteLink.objects.create(note=note, **link_data)
 
-        note.save()
+            note.save()
 
-        return note
+            return note
 
     def update(self, instance, validated_data):
         """Update and return an existing Note instance, given the validated data."""