diff --git a/reviewboard/webapi/resources/hosting_service_account.py b/reviewboard/webapi/resources/hosting_service_account.py
index 4b066f9c912cd85625151b73c80f480424357657..57ce4ebde7764e5ea8d78d226054a363552ea474 100644
--- a/reviewboard/webapi/resources/hosting_service_account.py
+++ b/reviewboard/webapi/resources/hosting_service_account.py
@@ -164,7 +164,7 @@ class HostingServiceAccountResource(WebAPIResource):
                     'reason': six.text_type(e),
                 }
 
-        service.save()
+        account.save()
 
         return 201, {
             self.item_result_key: account,
diff --git a/reviewboard/webapi/tests/mimetypes.py b/reviewboard/webapi/tests/mimetypes.py
index 46cc1e75dc55418a7495e65d9b27431606dc8639..77a83a6c37cd7b8bd08eb5b6b521ce296bb3636d 100644
--- a/reviewboard/webapi/tests/mimetypes.py
+++ b/reviewboard/webapi/tests/mimetypes.py
@@ -50,6 +50,12 @@ hosting_service_list_mimetype = _build_mimetype('hosting-services')
 hosting_service_item_mimetype = _build_mimetype('hosting-service')
 
 
+hosting_service_account_list_mimetype = \
+    _build_mimetype('hosting-service-accounts')
+hosting_service_account_item_mimetype = \
+    _build_mimetype('hosting-service-account')
+
+
 repository_list_mimetype = _build_mimetype('repositories')
 repository_item_mimetype = _build_mimetype('repository')
 
diff --git a/reviewboard/webapi/tests/mixins.py b/reviewboard/webapi/tests/mixins.py
index 5e84c611755d380124aa3d0ab1e3c71afcb1757d..35a3f6743c82ef6137d0698e049c11e044b0f8ea 100644
--- a/reviewboard/webapi/tests/mixins.py
+++ b/reviewboard/webapi/tests/mixins.py
@@ -276,7 +276,7 @@ class BasicGetItemTestsWithLocalSiteMixin(BasicGetItemTestsMixin):
 
         rsp = self.apiGet(url, expected_mimetype=mimetype)
         self.assertEqual(rsp['stat'], 'ok')
-        self.assertTrue(self.resource.item_result_key in rsp)
+        self.assertIn(self.resource.item_result_key, rsp)
 
         item_rsp = rsp[self.resource.item_result_key]
         self.compare_item(item_rsp, item)
diff --git a/reviewboard/webapi/tests/test_hosting_service_account.py b/reviewboard/webapi/tests/test_hosting_service_account.py
new file mode 100644
index 0000000000000000000000000000000000000000..324f11d19ba9dcf2bb31bece7f54ed36981cdf61
--- /dev/null
+++ b/reviewboard/webapi/tests/test_hosting_service_account.py
@@ -0,0 +1,120 @@
+from __future__ import unicode_literals
+
+from django.utils import six
+
+from reviewboard.hostingsvcs.models import HostingServiceAccount
+from reviewboard.site.models import LocalSite
+from reviewboard.webapi.resources import resources
+from reviewboard.webapi.tests.base import BaseWebAPITestCase
+from reviewboard.webapi.tests.mimetypes import (
+    hosting_service_account_item_mimetype,
+    hosting_service_account_list_mimetype)
+from reviewboard.webapi.tests.mixins import BasicTestsMetaclass
+from reviewboard.webapi.tests.urls import (
+    get_hosting_service_account_item_url,
+    get_hosting_service_account_list_url)
+
+
+def _compare_item(self, item_rsp, account):
+    self.assertEqual(item_rsp['id'], account.id)
+    self.assertEqual(item_rsp['username'], account.username)
+    self.assertEqual(item_rsp['service'], account.service.id)
+
+
+@six.add_metaclass(BasicTestsMetaclass)
+class ResourceListTests(BaseWebAPITestCase):
+    """Testing the HostingServiceAccount list APIs."""
+    sample_api_url = 'hosting-services-accounts/'
+    resource = resources.hosting_service_account
+    fixtures = ['test_users']
+
+    basic_post_use_admin = True
+
+    compare_item = _compare_item
+
+    def setup_http_not_allowed_list_test(self, user):
+        return get_hosting_service_account_list_url()
+
+    #
+    # HTTP GET tests
+    #
+
+    def setup_basic_get_test(self, user, with_local_site, local_site_name,
+                             populate_items):
+        if populate_items:
+            if with_local_site:
+                local_site = LocalSite.objects.get(name=local_site_name)
+            else:
+                local_site = None
+
+            accounts = [
+                HostingServiceAccount.objects.create(
+                    service_name='googlecode',
+                    username='bob',
+                    local_site=local_site)
+            ]
+        else:
+            accounts = []
+
+        return (get_hosting_service_account_list_url(local_site_name),
+                hosting_service_account_list_mimetype,
+                accounts)
+
+    #
+    # HTTP POST tests
+    #
+
+    def setup_basic_post_test(self, user, with_local_site, local_site_name,
+                              post_valid_data):
+        if post_valid_data:
+            post_data = {
+                'username': 'bob',
+                'service_id': 'googlecode',
+            }
+        else:
+            post_data = {}
+
+        return (get_hosting_service_account_list_url(local_site_name),
+                hosting_service_account_item_mimetype,
+                post_data,
+                [])
+
+    def check_post_result(self, user, rsp):
+        HostingServiceAccount.objects.get(
+            pk=rsp['hosting_service_account']['id'])
+
+
+@six.add_metaclass(BasicTestsMetaclass)
+class ResourceItemTests(BaseWebAPITestCase):
+    """Testing the HostingService item APIs."""
+    fixtures = ['test_users']
+    sample_api_url = 'hosting-service-accounts/<id>/'
+    resource = resources.hosting_service_account
+
+    compare_item = _compare_item
+
+    def setup_http_not_allowed_item_test(self, user):
+        account = HostingServiceAccount.objects.create(
+            service_name='googlecode',
+            username='bob')
+
+        return get_hosting_service_account_item_url(account.pk)
+
+    #
+    # HTTP GET tests
+    #
+
+    def setup_basic_get_test(self, user, with_local_site, local_site_name):
+        if with_local_site:
+            local_site = LocalSite.objects.get(name=local_site_name)
+        else:
+            local_site = None
+
+        account = HostingServiceAccount.objects.create(
+            service_name='googlecode',
+            username='bob',
+            local_site=local_site)
+
+        return (get_hosting_service_account_item_url(account, local_site_name),
+                hosting_service_account_item_mimetype,
+                account)
diff --git a/reviewboard/webapi/tests/urls.py b/reviewboard/webapi/tests/urls.py
index 73ea57a733a7cfdb925fa0e7078afde595cfd17e..86ecc742aeced77db1acc0e012b0563068806f32 100644
--- a/reviewboard/webapi/tests/urls.py
+++ b/reviewboard/webapi/tests/urls.py
@@ -1,5 +1,6 @@
 from __future__ import unicode_literals
 
+from reviewboard.hostingsvcs.models import HostingServiceAccount
 from reviewboard.hostingsvcs.service import HostingService
 from reviewboard.reviews.models import ReviewRequest
 from reviewboard.scmtools.models import Repository
@@ -233,6 +234,22 @@ def get_hosting_service_item_url(hosting_service_or_id, local_site_name=None):
 
 
 #
+# HostingServiceAccountResource
+#
+def get_hosting_service_account_list_url(local_site_name=None):
+    return resources.hosting_service_account.get_list_url(
+        local_site_name=local_site_name)
+
+
+def get_hosting_service_account_item_url(account_or_id, local_site_name=None):
+    account_id = _normalize_id(account_or_id, HostingServiceAccount)
+
+    return resources.hosting_service_account.get_item_url(
+        local_site_name=local_site_name,
+        account_id=account_id)
+
+
+#
 # RepositoryResource
 #
 def get_repository_list_url(local_site_name=None):
