diff --git a/include/asterisk/app.h b/include/asterisk/app.h
index 2b5d5bf164c0e65f3049a61a64489fbdb6a16bb0..623f0884eefeeea66d9539ef8aeab533a51dfe07 100644
--- a/include/asterisk/app.h
+++ b/include/asterisk/app.h
@@ -567,6 +567,15 @@ struct ast_vm_functions {
 	ast_vm_msg_play_fn *msg_play;
 };
 
+/*!
+ * \brief Determine if a voicemail provider is registered.
+ * \since 13.0.0
+ *
+ * \retval 0 if no privider registered.
+ * \retval 1 if a privider is registered.
+ */
+int ast_vm_is_registered(void);
+
 /*!
  * \brief Set voicemail function callbacks
  *
diff --git a/main/app.c b/main/app.c
index 140afde7b9a9cde43710276c40659c06444d9f32..579984dab451dd4f3bab87b851b0d23d238e3a38 100644
--- a/main/app.c
+++ b/main/app.c
@@ -432,6 +432,17 @@ static AO2_GLOBAL_OBJ_STATIC(vm_provider);
 /*! Voicemail not registered warning */
 static int vm_warnings;
 
+int ast_vm_is_registered(void)
+{
+	struct ast_vm_functions *table;
+	int is_registered;
+
+	table = ao2_global_obj_ref(vm_provider);
+	is_registered = table ? 1 : 0;
+	ao2_cleanup(table);
+	return is_registered;
+}
+
 int __ast_vm_register(const struct ast_vm_functions *vm_table, struct ast_module *module)
 {
 	RAII_VAR(struct ast_vm_functions *, table, NULL, ao2_cleanup);
diff --git a/tests/test_voicemail_api.c b/tests/test_voicemail_api.c
index 2357b0a3dad28bd154e982db21496b22e3f240eb..01efeeec2d56cdf1aa2746beb89e2ef25255b1b3 100644
--- a/tests/test_voicemail_api.c
+++ b/tests/test_voicemail_api.c
@@ -72,7 +72,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
  * envelope files on the file system
  */
 #define VM_API_TEST_SETUP do { \
-	if (test_vm_api_test_setup()) { \
+	if (!ast_vm_is_registered()) { \
+		ast_test_status_update(test, "No voicemail provider registered.\n"); \
+		return AST_TEST_FAIL; \
+	} else if (test_vm_api_test_setup()) { \
 		VM_API_TEST_CLEANUP; \
 		ast_test_status_update(test, "Failed to set up necessary mock objects for voicemail API test\n"); \
 		return AST_TEST_FAIL; \