diff --git a/CHANGELOG.md b/CHANGELOG.md
index 23433c2..48c4bf0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,9 @@ Changelog
 * Support forcing an individual event to be sent synchronously to Bugsnag.
   Given a configuration where asynchronous=True (the default setting), use
   `notify(ex, asynchronous=False)` to block until the event is delivered.
+* Support configuring app type, which is a searchable field on the Bugsnag
+  dashboard. Set `Configuration.app_type` to add a `type` property to the app
+  metadata of an event.
 
 ### Fixes
 
diff --git a/bugsnag/configuration.py b/bugsnag/configuration.py
index 7084011..4bc2d78 100644
--- a/bugsnag/configuration.py
+++ b/bugsnag/configuration.py
@@ -68,6 +68,7 @@ class Configuration(_BaseConfiguration):
         self.delivery = create_default_delivery()
         self.lib_root = get_python_lib()
         self.project_root = os.getcwd()
+        self.app_type = None
         self.app_version = None
         self.params_filters = ["password", "password_confirmation", "cookie",
                                "authorization"]
@@ -111,7 +112,7 @@ class Configuration(_BaseConfiguration):
             'ignore_classes', 'lib_root', 'notify_release_stages',
             'params_filters', 'project_root', 'proxy_host', 'release_stage',
             'send_code', 'session_endpoint', 'traceback_exclude_modules',
-            'use_ssl',
+            'use_ssl', 'app_type',
         ]
 
         for option_name in options.keys():
@@ -134,6 +135,18 @@ class Configuration(_BaseConfiguration):
     def api_key(self, value):
         self._api_key = value
 
+    @property
+    def app_type(self):
+        """
+        Category for the current application or task
+        """
+        return self._app_type
+
+    @app_type.setter  # type: ignore
+    @validate_str_setter
+    def app_type(self, value):
+        self._app_type = value
+
     @property
     def app_version(self):
         """
diff --git a/bugsnag/notification.py b/bugsnag/notification.py
index aaab7c5..8a18c82 100644
--- a/bugsnag/notification.py
+++ b/bugsnag/notification.py
@@ -50,6 +50,7 @@ class Notification(object):
 
         self.release_stage = get_config("release_stage")
         self.app_version = get_config("app_version")
+        self.app_type = get_config("app_type")
         self.hostname = get_config("hostname")
         self.runtime_versions = get_config("runtime_versions")
         self.send_code = get_config("send_code")
@@ -232,7 +233,10 @@ class Notification(object):
                 "severityReason": self.severity_reason,
                 "unhandled": self.unhandled,
                 "releaseStage": self.release_stage,
-                "appVersion": self.app_version,
+                "app": {
+                    "version": self.app_version,
+                    "type": self.app_type,
+                },
                 "context": self.context,
                 "groupingHash": self.grouping_hash,
                 "exceptions": [{

diff --git a/tests/integrations/conftest.py b/tests/integrations/conftest.py
index 7edb31b..9425c21 100644
--- a/tests/integrations/conftest.py
+++ b/tests/integrations/conftest.py
@@ -11,4 +11,5 @@ def bugsnag_server():
 
     yield server
 
+    bugsnag.configure(app_type=None)
     server.shutdown()
diff --git a/tests/test_configuration.py b/tests/test_configuration.py
index 47d0603..be9b29c 100644
--- a/tests/test_configuration.py
+++ b/tests/test_configuration.py
@@ -138,6 +138,21 @@ class TestConfiguration(unittest.TestCase):
             assert len(record) == 1
             assert c.endpoint == 'https://notify.example.com'
 
+    def test_validate_app_type(self):
+        c = Configuration()
+        assert c.app_type is None
+        with pytest.warns(RuntimeWarning) as record:
+            c.configure(app_type=[])
+
+            assert len(record) == 1
+            assert str(record[0].message) == 'app_type should be str, got list'
+            assert c.app_type is None
+
+            c.configure(app_type='rq')
+
+            assert len(record) == 1
+            assert c.app_type == 'rq'
+
     def test_validate_app_version(self):
         c = Configuration()
         with pytest.warns(RuntimeWarning) as record:
diff --git a/tests/test_notification.py b/tests/test_notification.py
index 20b10c6..3997dee 100644
--- a/tests/test_notification.py
+++ b/tests/test_notification.py
@@ -159,3 +159,26 @@ class TestNotification(unittest.TestCase):
         device = payload['events'][0]['device']
         self.assertEqual('test_host_name', device['hostname'])
         self.assertEqual('9.9.9', device['runtimeVersions']['python'])
+
+    def test_default_app_type(self):
+        """
+        app_type is None by default
+        """
+        config = Configuration()
+        notification = Notification(Exception("oops"), config, {})
+        payload = json.loads(notification._payload())
+        app = payload['events'][0]['app']
+
+        assert app['type'] is None
+
+    def test_configured_app_type(self):
+        """
+        It should include app type if specified
+        """
+        config = Configuration()
+        config.configure(app_type='rq')
+        notification = Notification(Exception("oops"), config, {})
+        payload = json.loads(notification._payload())
+        app = payload['events'][0]['app']
+
+        assert app['type'] == 'rq'
diff --git a/tests/test_notify.py b/tests/test_notify.py
index 185b0a8..9b90d9c 100644
--- a/tests/test_notify.py
+++ b/tests/test_notify.py
@@ -80,7 +80,7 @@ class TestBugsnag(IntegrationTest):
         bugsnag.notify(ScaryException('unexpected failover'))
         json_body = self.server.received[0]['json_body']
         event = json_body['events'][0]
-        self.assertEqual('343.2.10', event['appVersion'])
+        self.assertEqual('343.2.10', event['app']['version'])
 
     def test_notify_override_context(self):
         bugsnag.notify(ScaryException('unexpected failover'),
@@ -189,6 +189,31 @@ class TestBugsnag(IntegrationTest):
         bugsnag.notify(ScaryException('unexpected failover'))
         self.assertEqual(0, len(self.server.received))
 
+    def test_notify_custom_app_type(self):
+        bugsnag.notify(ScaryException('unexpected failover'), app_type='work')
+        json_body = self.server.received[0]['json_body']
+        event = json_body['events'][0]
+        self.assertEqual('work', event['app']['type'])
+
+    def test_notify_callback_app_type(self):
+
+        def callback(report):
+            report.app_type = 'whopper'
+
+        bugsnag.configure(app_type='rq')
+        bugsnag.before_notify(callback)
+        bugsnag.notify(ScaryException('unexpected failover'))
+        json_body = self.server.received[0]['json_body']
+        event = json_body['events'][0]
+        self.assertEqual('whopper', event['app']['type'])
+
+    def test_notify_configured_app_type(self):
+        bugsnag.configure(app_type='rq')
+        bugsnag.notify(ScaryException('unexpected failover'))
+        json_body = self.server.received[0]['json_body']
+        event = json_body['events'][0]
+        self.assertEqual('rq', event['app']['type'])
+
     def test_notify_sends_when_before_notify_throws(self):
 
         def callback(report):

No way to specify the app_type information
### Description

The API accepts a `app.type` field in the `events` array, but the Python lib doesn't provide a way to specify it.

### Issue

One should be able to specify this field using the official Python client.

tests/test_configuration.py::TestConfiguration::test_validate_app_type tests/test_notification.py::TestNotification::test_configured_app_type tests/test_notification.py::TestNotification::test_default_app_type tests/test_notify.py::TestBugsnag::test_notify_callback_app_type tests/test_notify.py::TestBugsnag::test_notify_configured_app_type tests/test_notify.py::TestBugsnag::test_notify_configured_app_version tests/test_notify.py::TestBugsnag::test_notify_custom_app_type
tests/test_configuration.py::TestConfiguration::test_custom_get_endpoint_default_ssl tests/test_configuration.py::TestConfiguration::test_custom_get_endpoint_no_use_ssl tests/test_configuration.py::TestConfiguration::test_custom_get_endpoint_use_ssl tests/test_configuration.py::TestConfiguration::test_default_middleware_location tests/test_configuration.py::TestConfiguration::test_full_custom_get_endpoint tests/test_configuration.py::TestConfiguration::test_full_custom_get_endpoint_no_use_ssl tests/test_configuration.py::TestConfiguration::test_full_custom_get_endpoint_use_ssl tests/test_configuration.py::TestConfiguration::test_get_endpoint_no_use_ssl tests/test_configuration.py::TestConfiguration::test_get_endpoint_use_ssl tests/test_configuration.py::TestConfiguration::test_hostname tests/test_configuration.py::TestConfiguration::test_ignore_classes tests/test_configuration.py::TestConfiguration::test_reads_api_key_from_environ tests/test_configuration.py::TestConfiguration::test_session_tracking_defaults tests/test_configuration.py::TestConfiguration::test_should_notify tests/test_configuration.py::TestConfiguration::test_validate_api_key tests/test_configuration.py::TestConfiguration::test_validate_app_version tests/test_configuration.py::TestConfiguration::test_validate_asynchronous tests/test_configuration.py::TestConfiguration::test_validate_auto_capture_sessions tests/test_configuration.py::TestConfiguration::test_validate_auto_notify tests/test_configuration.py::TestConfiguration::test_validate_delivery tests/test_configuration.py::TestConfiguration::test_validate_endpoint tests/test_configuration.py::TestConfiguration::test_validate_hostname tests/test_configuration.py::TestConfiguration::test_validate_ignore_classes tests/test_configuration.py::TestConfiguration::test_validate_lib_root tests/test_configuration.py::TestConfiguration::test_validate_notify_release_stages tests/test_configuration.py::TestConfiguration::test_validate_params_filters tests/test_configuration.py::TestConfiguration::test_validate_project_root tests/test_configuration.py::TestConfiguration::test_validate_proxy_host tests/test_configuration.py::TestConfiguration::test_validate_release_stage tests/test_configuration.py::TestConfiguration::test_validate_send_code tests/test_configuration.py::TestConfiguration::test_validate_session_endpoint tests/test_configuration.py::TestConfiguration::test_validate_traceback_exclude_modules tests/test_configuration.py::TestConfiguration::test_validate_unknown_config_option tests/test_notification.py::TestNotification::test_code tests/test_notification.py::TestNotification::test_code_at_end_of_file tests/test_notification.py::TestNotification::test_code_at_start_of_file tests/test_notification.py::TestNotification::test_code_turned_off tests/test_notification.py::TestNotification::test_device_data tests/test_notification.py::TestNotification::test_no_traceback_exclude_modules tests/test_notification.py::TestNotification::test_sanitize tests/test_notification.py::TestNotification::test_traceback_exclude_modules tests/test_notify.py::TestBugsnag::test_asynchronous_notify tests/test_notify.py::TestBugsnag::test_auto_notify_defaults tests/test_notify.py::TestBugsnag::test_auto_notify_overrides tests/test_notify.py::TestBugsnag::test_external_middleware_can_change_severity tests/test_notify.py::TestBugsnag::test_external_middleware_cannot_change_severity_reason tests/test_notify.py::TestBugsnag::test_internal_middleware_can_change_severity_reason tests/test_notify.py::TestBugsnag::test_internal_middleware_changes_severity tests/test_notify.py::TestBugsnag::test_middleware_stack_order tests/test_notify.py::TestBugsnag::test_middleware_stack_order_legacy tests/test_notify.py::TestBugsnag::test_notify_bad_encoding_exception_tuple tests/test_notify.py::TestBugsnag::test_notify_bad_encoding_metadata tests/test_notify.py::TestBugsnag::test_notify_before_notify_add_custom_data tests/test_notify.py::TestBugsnag::test_notify_before_notify_modifying_api_key tests/test_notify.py::TestBugsnag::test_notify_before_notify_modifying_metadata tests/test_notify.py::TestBugsnag::test_notify_before_notify_remove_api_key tests/test_notify.py::TestBugsnag::test_notify_configured_api_key tests/test_notify.py::TestBugsnag::test_notify_configured_hostname tests/test_notify.py::TestBugsnag::test_notify_configured_invalid_api_key tests/test_notify.py::TestBugsnag::test_notify_configured_lib_root tests/test_notify.py::TestBugsnag::test_notify_configured_metadata_sections tests/test_notify.py::TestBugsnag::test_notify_configured_project_root tests/test_notify.py::TestBugsnag::test_notify_configured_release_stage tests/test_notify.py::TestBugsnag::test_notify_default_severity tests/test_notify.py::TestBugsnag::test_notify_device_filter tests/test_notify.py::TestBugsnag::test_notify_error_class tests/test_notify.py::TestBugsnag::test_notify_error_message tests/test_notify.py::TestBugsnag::test_notify_exception_tuple tests/test_notify.py::TestBugsnag::test_notify_exception_tuple_with_traceback tests/test_notify.py::TestBugsnag::test_notify_exception_with_traceback_option tests/test_notify.py::TestBugsnag::test_notify_ignore_class tests/test_notify.py::TestBugsnag::test_notify_invalid_severity tests/test_notify.py::TestBugsnag::test_notify_invalid_values_tuple tests/test_notify.py::TestBugsnag::test_notify_metadata_bool_value tests/test_notify.py::TestBugsnag::test_notify_metadata_complex_value tests/test_notify.py::TestBugsnag::test_notify_metadata_filter tests/test_notify.py::TestBugsnag::test_notify_metadata_integer_value tests/test_notify.py::TestBugsnag::test_notify_metadata_set_value tests/test_notify.py::TestBugsnag::test_notify_metadata_tuple_value tests/test_notify.py::TestBugsnag::test_notify_method tests/test_notify.py::TestBugsnag::test_notify_non_exception tests/test_notify.py::TestBugsnag::test_notify_override_api_key tests/test_notify.py::TestBugsnag::test_notify_override_context tests/test_notify.py::TestBugsnag::test_notify_override_deprecated_user_id tests/test_notify.py::TestBugsnag::test_notify_override_grouping_hash tests/test_notify.py::TestBugsnag::test_notify_override_metadata_sections tests/test_notify.py::TestBugsnag::test_notify_override_severity tests/test_notify.py::TestBugsnag::test_notify_override_user tests/test_notify.py::TestBugsnag::test_notify_payload_matching_filter tests/test_notify.py::TestBugsnag::test_notify_payload_version tests/test_notify.py::TestBugsnag::test_notify_proxy tests/test_notify.py::TestBugsnag::test_notify_recursive_metadata_array tests/test_notify.py::TestBugsnag::test_notify_recursive_metadata_dict tests/test_notify.py::TestBugsnag::test_notify_request_count tests/test_notify.py::TestBugsnag::test_notify_sends_when_before_notify_throws tests/test_notify.py::TestBugsnag::test_notify_severity_overridden tests/test_notify.py::TestBugsnag::test_notify_single_value_tuple tests/test_notify.py::TestBugsnag::test_notify_stacktrace tests/test_notify.py::TestBugsnag::test_notify_unconfigured_release_stage tests/test_notify.py::TestBugsnag::test_notify_unhandled_defaults tests/test_notify.py::TestBugsnag::test_notify_unhandled_severity_callback tests/test_notify.py::TestBugsnag::test_notify_unicode_metadata tests/test_notify.py::TestBugsnag::test_notify_user_filter tests/test_notify.py::TestBugsnag::test_synchronous_individual_notify