diff --git a/program/serializers.py b/program/serializers.py
index 66fd50f9e512cdcf01e7b9a1ad2d6388e54e0ee7..179238eacab896376736ee147ebb1a8a0ded3085 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -53,9 +53,11 @@ from program.models import (
 )
 from program.typing import (
     Logo,
+    MicroProgram,
     NestedEpisode,
     NestedSchedule,
     NestedShow,
+    ProgramFallback,
     RadioCBASettings,
     RadioImageRequirementsSettings,
     RadioPlayoutSettings,
@@ -1197,12 +1199,12 @@ class RadioSettingsSerializer(serializers.ModelSerializer):
 
     def get_cba(self, obj) -> RadioCBASettings:
         if self.context.get("request").user.is_authenticated:
-            return {
-                "api_key": obj.cba_api_key,
-                "domains": obj.cba_domains,
-            }
+            return RadioCBASettings(
+                api_key=obj.cba_api_key,
+                domains=obj.cba_domains,
+            )
         else:
-            return {"domains": obj.cba_domains}
+            return RadioCBASettings(domains=obj.cba_domains)
 
     @staticmethod
     def get_image_requirements(obj) -> RadioImageRequirementsSettings:
@@ -1252,36 +1254,38 @@ class RadioSettingsSerializer(serializers.ModelSerializer):
 
     @staticmethod
     def get_program(obj) -> RadioProgramSettings:
-        return {
-            "micro": {"show_id": obj.micro_show.id if obj.micro_show else None},
-            "fallback": {
-                "show_id": obj.fallback_show.id if obj.fallback_show else None,
-                "default_pool": "fallback" if obj.fallback_default_pool else "",
-            },
-        }
+        return RadioProgramSettings(
+            micro=MicroProgram(show_id=obj.micro_show.id if obj.micro_show else None),
+            fallback=ProgramFallback(
+                show_id=obj.fallback_show.id if obj.fallback_show else None,
+                default_pool="fallback" if obj.fallback_default_pool else "",
+            ),
+        )
 
     @staticmethod
     def get_playout(obj) -> RadioPlayoutSettings:
-        return {
-            "line_in_channels": obj.line_in_channels,
-            "pools": obj.pools,
-        }
+        return RadioPlayoutSettings(
+            line_in_channels=obj.line_in_channels,
+            pools=obj.pools,
+        )
 
     @staticmethod
     def get_station(obj) -> RadioStationSettings:
-        return {
-            "name": obj.station_name,
-            "logo": (
-                Logo(
-                    url=f"{settings.SITE_URL}{obj.station_logo.url}",
-                    height=obj.station_logo.height,
-                    width=obj.station_logo.width,
-                )
-                if obj.station_logo
-                else None
-            ),
-            "website": obj.station_website,
-        }
+        logo = (
+            Logo(
+                url=f"{settings.SITE_URL}{obj.station_logo.url}",
+                height=obj.station_logo.height,
+                width=obj.station_logo.width,
+            )
+            if obj.station_logo
+            else None
+        )
+
+        return RadioStationSettings(
+            name=obj.station_name,
+            logo=logo,
+            website=obj.station_website,
+        )
 
 
 # done this way to get the schema annotations for datetime right