diff --git a/opentech/api/__init__.py b/opentech/apply/api/__init__.py
similarity index 100%
rename from opentech/api/__init__.py
rename to opentech/apply/api/__init__.py
diff --git a/opentech/apply/api/urls.py b/opentech/apply/api/urls.py
new file mode 100644
index 0000000000000000000000000000000000000000..52f7c206e9b288a4582041c19bdfac655c795555
--- /dev/null
+++ b/opentech/apply/api/urls.py
@@ -0,0 +1,10 @@
+from django.urls import include, path
+
+from .v1 import urls as v1_urls
+
+app_name = 'api'
+
+
+urlpatterns = [
+    path('v1/', include(v1_urls)),
+]
diff --git a/opentech/apply/api/v1/__init__.py b/opentech/apply/api/v1/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/opentech/api/pagination.py b/opentech/apply/api/v1/pagination.py
similarity index 100%
rename from opentech/api/pagination.py
rename to opentech/apply/api/v1/pagination.py
diff --git a/opentech/apply/funds/permissions.py b/opentech/apply/api/v1/permissions.py
similarity index 100%
rename from opentech/apply/funds/permissions.py
rename to opentech/apply/api/v1/permissions.py
diff --git a/opentech/apply/funds/serializers.py b/opentech/apply/api/v1/serializers.py
similarity index 98%
rename from opentech/apply/funds/serializers.py
rename to opentech/apply/api/v1/serializers.py
index cd828247a3e32144b6a4d6066e2f76d7de0b8b80..bc2f7e1e0b24fd57cfdc3315fe19c88d9d1e7377 100644
--- a/opentech/apply/funds/serializers.py
+++ b/opentech/apply/api/v1/serializers.py
@@ -7,6 +7,7 @@ from rest_framework import serializers
 
 from opentech.apply.activity.models import Activity
 from opentech.apply.determinations.views import DeterminationCreateOrUpdateView
+from opentech.apply.funds.models import ApplicationSubmission, RoundsAndLabs
 from opentech.apply.review.models import Review, ReviewOpinion
 from opentech.apply.review.options import RECOMMENDATION_CHOICES
 from opentech.apply.users.groups import PARTNER_GROUP_NAME, STAFF_GROUP_NAME
@@ -112,7 +113,7 @@ class TimestampField(serializers.Field):
 
 
 class SubmissionListSerializer(serializers.ModelSerializer):
-    url = serializers.HyperlinkedIdentityField(view_name='funds:api:submissions:detail')
+    url = serializers.HyperlinkedIdentityField(view_name='api:v1:submissions:detail')
     round = serializers.SerializerMethodField()
     last_update = TimestampField()
 
diff --git a/opentech/apply/api/v1/urls.py b/opentech/apply/api/v1/urls.py
new file mode 100644
index 0000000000000000000000000000000000000000..d1996f19ca456d1dcb84d2a3b6f1b2a438bb03d3
--- /dev/null
+++ b/opentech/apply/api/v1/urls.py
@@ -0,0 +1,29 @@
+from django.urls import include, path
+
+from .views import (
+    CommentList,
+    CommentListCreate,
+    RoundLabDetail,
+    RoundLabList,
+    SubmissionAction,
+    SubmissionList,
+    SubmissionDetail,
+)
+
+app_name = 'v1'
+
+urlpatterns = [
+    path('submissions/', include(([
+        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('', RoundLabList.as_view(), name='list'),
+        path('<int:pk>/', RoundLabDetail.as_view(), name='detail'),
+    ], 'rounds'))),
+    path('comments/', include(([
+        path('', CommentList.as_view(), name='list'),
+    ], 'comments')))
+]
diff --git a/opentech/apply/funds/api_views.py b/opentech/apply/api/v1/views.py
similarity index 97%
rename from opentech/apply/funds/api_views.py
rename to opentech/apply/api/v1/views.py
index 75d31ef1c336ecf530bb79fc760384b152b22ec1..5bcf532dab1dab76e49693d68591cd530a51e9f8 100644
--- a/opentech/apply/funds/api_views.py
+++ b/opentech/apply/api/v1/views.py
@@ -12,14 +12,17 @@ from rest_framework.exceptions import (NotFound, PermissionDenied,
 from rest_framework_api_key.permissions import HasAPIKey
 from django_filters import rest_framework as filters
 
-from opentech.api.pagination import StandardResultsSetPagination
+from opentech.apply.funds.models import ApplicationSubmission, RoundsAndLabs
+from opentech.apply.funds.workflow import PHASES
+
 from opentech.apply.activity.models import Activity, COMMENT
 from opentech.apply.activity.messaging import messenger, MESSAGES
 from opentech.apply.determinations.views import DeterminationCreateOrUpdateView
 from opentech.apply.review.models import Review
 from opentech.apply.funds.models import FundType, LabType
 
-from .models import ApplicationSubmission, RoundsAndLabs
+from .pagination import StandardResultsSetPagination
+from .permissions import IsApplyStaffUser
 from .serializers import (
     CommentSerializer,
     CommentCreateSerializer,
diff --git a/opentech/apply/funds/urls.py b/opentech/apply/funds/urls.py
index 82e31476aa4bf6312cac9d9bac97da4ca8f6cd57..d23951716fdde872d409577af00fc19be8c41292 100644
--- a/opentech/apply/funds/urls.py
+++ b/opentech/apply/funds/urls.py
@@ -95,5 +95,4 @@ urlpatterns = [
     path('submissions/', include(submission_urls)),
     path('rounds/', include(rounds_urls)),
     path('projects/', include(projects_urls)),
-    path('api/', include(api_urls)),
 ]
diff --git a/opentech/apply/urls.py b/opentech/apply/urls.py
index 6138117fab04d25e24a59884ba270f81a3b7f2ec..9b1c25c11b2acbc2718da9fff12caa1c3e0ab3f4 100644
--- a/opentech/apply/urls.py
+++ b/opentech/apply/urls.py
@@ -6,6 +6,7 @@ from two_factor.urls import urlpatterns as tf_urls
 from .utils import views
 from .users import urls as users_urls
 from .dashboard import urls as dashboard_urls
+from .api import urls as api_urls
 
 from opentech.urls import base_urlpatterns
 
@@ -14,6 +15,7 @@ urlpatterns = [
     path('apply/', include('opentech.apply.funds.urls', 'apply')),
     path('activity/', include('opentech.apply.activity.urls', 'activity')),
     path('', include(users_urls)),
+    path('api/', include(api_urls)),
     path('dashboard/', include(dashboard_urls)),
     path('hijack/', include('hijack.urls', 'hijack')),
     path('', include(tf_urls, 'two_factor')),
diff --git a/opentech/static_src/src/app/src/api/notes.js b/opentech/static_src/src/app/src/api/notes.js
index 7dd077494a5c963a905e0663fe5dae565215d041..7f6de3c328255015a6c149bbbcdf36a850a02c7c 100644
--- a/opentech/static_src/src/app/src/api/notes.js
+++ b/opentech/static_src/src/app/src/api/notes.js
@@ -1,6 +1,6 @@
 export function fetchNotesForSubmission(submissionID, visibility = 'team') {
     return {
-        path: `/apply/api/submissions/${submissionID}/comments/`,
+        path: `/v1/submissions/${submissionID}/comments/`,
         params: {
             visibility,
             page_size: 1000,
@@ -11,7 +11,7 @@ export function fetchNotesForSubmission(submissionID, visibility = 'team') {
 
 export function fetchNewNotesForSubmission(submissionID, latestID, visibility = 'team') {
     return {
-        path: `/apply/api/submissions/${submissionID}/comments/`,
+        path: `/v1/submissions/${submissionID}/comments/`,
         params: {
             visibility,
             newer: latestID,
@@ -23,7 +23,7 @@ export function fetchNewNotesForSubmission(submissionID, latestID, visibility =
 
 export function createNoteForSubmission(submissionID, note) {
     return {
-        path: `/apply/api/submissions/${submissionID}/comments/`,
+        path: `/v1/submissions/${submissionID}/comments/`,
         method: 'POST',
         options: {
             body: note,
diff --git a/opentech/static_src/src/app/src/api/rounds.js b/opentech/static_src/src/app/src/api/rounds.js
index c7ef0a75be9a4e641419fa1e2227d6fe8e55464b..c0520203ac1884994ffa09206a9f2109d2c0c4c7 100644
--- a/opentech/static_src/src/app/src/api/rounds.js
+++ b/opentech/static_src/src/app/src/api/rounds.js
@@ -1,12 +1,12 @@
 export function fetchRound(id) {
     return {
-        path:`/apply/api/rounds/${id}/`,
+        path:`/v1/rounds/${id}/`,
     };
 }
 
 export function fetchRounds() {
     return {
-        path:`/apply/api/rounds/`,
+        path:`/v1/rounds/`,
         params: {
             page_size: 1000,
         },
diff --git a/opentech/static_src/src/app/src/api/submissions.js b/opentech/static_src/src/app/src/api/submissions.js
index 88fdd2758424b915fee9b5c76d38607574030fef..efbf81653c9673092715bb7fc9cd9f4773069f50 100644
--- a/opentech/static_src/src/app/src/api/submissions.js
+++ b/opentech/static_src/src/app/src/api/submissions.js
@@ -1,6 +1,6 @@
 export function fetchSubmissionsByRound(id) {
     return {
-        path:'/apply/api/submissions/',
+        path:'/v1/submissions/',
         params: {
             round: id,
             page_size: 1000,
@@ -10,7 +10,7 @@ export function fetchSubmissionsByRound(id) {
 
 export function fetchSubmission(id) {
     return {
-        path: `/apply/api/submissions/${id}/`,
+        path: `/v1/submissions/${id}/`,
     };
 }
 
@@ -20,14 +20,14 @@ export function fetchSubmissionsByStatuses(statuses) {
     statuses.forEach(v => params.append('status', v));
 
     return {
-        path:'/apply/api/submissions/',
+        path:'/v1/submissions/',
         params,
     };
 }
 
 export function executeSubmissionAction(submissionID, action) {
     return {
-        path: `/apply/api/submissions/${submissionID}/actions/`,
+        path: `/v1/submissions/${submissionID}/actions/`,
         method: 'POST',
         options: {
             body: {
diff --git a/opentech/static_src/src/app/src/api/utils.js b/opentech/static_src/src/app/src/api/utils.js
index 29e4a3ef537aaa4054ba4738a0eb1fb989c288a8..703bf2d5b7f31f2fa8a54178f88165fe2bcefdd9 100644
--- a/opentech/static_src/src/app/src/api/utils.js
+++ b/opentech/static_src/src/app/src/api/utils.js
@@ -6,7 +6,7 @@ const getBaseUrl = () => {
 
 export function apiFetch({path, method = 'GET', params = new URLSearchParams, options = {}}) {
     const url = new URL(getBaseUrl());
-    url.pathname = path;
+    url.pathname = url.pathname + path;
 
     for (const [paramKey, paramValue] of getIteratorForParams(params)) {
         url.searchParams.append(paramKey, paramValue);
diff --git a/opentech/static_src/src/app/webpack.dev.config.js b/opentech/static_src/src/app/webpack.dev.config.js
index f86535ada9080507d6fed9941b029213df88656b..3aac5c995417b371daa9ed33c41ba549060f128c 100644
--- a/opentech/static_src/src/app/webpack.dev.config.js
+++ b/opentech/static_src/src/app/webpack.dev.config.js
@@ -15,7 +15,7 @@ devConfig.plugins = devConfig.plugins.concat([
     new webpack.NoEmitOnErrorsPlugin(),
     new BundleTracker({filename: './opentech/static_compiled/app/webpack-stats.json'}),
     new webpack.EnvironmentPlugin({
-        API_BASE_URL: 'http://apply.localhost:8000/',
+        API_BASE_URL: 'http://apply.localhost:8000/api',
     }),
 ])