diff --git a/opentech/apply/funds/api_views.py b/opentech/apply/funds/api_views.py
index bc7932bd5c675e17e5fe4c368af6a2d529ba7a15..d86e3def3aff50522d72d11b30d387f556746d22 100644
--- a/opentech/apply/funds/api_views.py
+++ b/opentech/apply/funds/api_views.py
@@ -8,11 +8,14 @@ from django_filters import rest_framework as filters
 from wagtail.core.models import Page
 
 from opentech.api.pagination import StandardResultsSetPagination
-from opentech.apply.activity.models import Activity
+from opentech.apply.activity.models import Activity, COMMENT
+from opentech.apply.activity.messaging import messenger, MESSAGES
+
 from .models import ApplicationSubmission
 from .models.applications import SubmittableStreamForm
 from .serializers import (
     CommentSerializer,
+    CommentCreateSerializer,
     RoundLabSerializer,
     SubmissionActionSerializer,
     SubmissionListSerializer,
@@ -100,3 +103,33 @@ class CommentList(generics.ListAPIView):
 
     def get_queryset(self):
         return super().get_queryset().visible_to(self.request.user)
+
+
+class CommentListCreate(generics.ListCreateAPIView):
+    queryset = Activity.comments.all()
+    serializer_class = CommentCreateSerializer
+    permission_classes = (
+        permissions.IsAuthenticated, IsApplyStaffUser,
+    )
+    filter_backends = (filters.DjangoFilterBackend,)
+    filter_fields = ('visibility',)
+    pagination_class = StandardResultsSetPagination
+
+    def get_queryset(self):
+        return super().get_queryset().filter(
+            submission=self.kwargs['pk']
+        ).visible_to(self.request.user)
+
+    def perform_create(self, serializer):
+        obj = serializer.save(
+            type=COMMENT,
+            user=self.request.user,
+            submission_id=self.kwargs['pk']
+        )
+        messenger(
+            MESSAGES.COMMENT,
+            request=self.request,
+            user=self.request.user,
+            submission=obj.submission,
+            related=obj,
+        )
diff --git a/opentech/apply/funds/serializers.py b/opentech/apply/funds/serializers.py
index 777459040a0e49360a60f4d98bb80928889f295f..cde0af1feaa6abf064fe6031a53a99f89eba088e 100644
--- a/opentech/apply/funds/serializers.py
+++ b/opentech/apply/funds/serializers.py
@@ -90,3 +90,11 @@ class CommentSerializer(serializers.ModelSerializer):
     class Meta:
         model = Activity
         fields = ('id', 'timestamp', 'user', 'submission', 'message', 'visibility')
+
+
+class CommentCreateSerializer(serializers.ModelSerializer):
+    user = serializers.StringRelatedField()
+
+    class Meta:
+        model = Activity
+        fields = ('id', 'timestamp', 'user', 'message', 'visibility')
diff --git a/opentech/apply/funds/urls.py b/opentech/apply/funds/urls.py
index 3c1b8919fd869d6cfa594490d8f8c8b1bbcadaa9..76e6630792b6b8b53cc7363332cc08f735be285a 100644
--- a/opentech/apply/funds/urls.py
+++ b/opentech/apply/funds/urls.py
@@ -12,6 +12,7 @@ from .views import (
 )
 from .api_views import (
     CommentList,
+    CommentListCreate,
     RoundLabDetail,
     SubmissionAction,
     SubmissionList,
@@ -46,6 +47,7 @@ api_urls = ([
         path('', SubmissionList.as_view(), name='list'),
         path('<int:pk>/', SubmissionDetail.as_view(), name='detail'),
         path('<int:pk>/actions/', SubmissionAction.as_view(), name='actions'),
+        path('<int:pk>/comments/', CommentListCreate.as_view(), name='comments'),
     ], 'submissions'))),
     path('rounds/', include(([
         path('<int:pk>/', RoundLabDetail.as_view(), name='detail'),