diff --git a/libpurple/purpleprotocol.h b/libpurple/purpleprotocol.h
--- a/libpurple/purpleprotocol.h
+++ b/libpurple/purpleprotocol.h
@@ -32,6 +32,8 @@
 
 #include <gio/gio.h>
 
+#include <birb.h>
+
 #include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL (purple_protocol_get_type())
@@ -146,6 +148,8 @@
 
 	PurpleConnection *(*create_connection)(PurpleProtocol *protocol, PurpleAccount *account, const char *password, GError **error);
 
+	BirbActionMenu *(*get_action_menu)(PurpleProtocol *protocol, PurpleAccount *account);
+
 	/*< private >*/
 	gpointer reserved[4];
 };
@@ -321,6 +325,20 @@
 PurpleConnection *purple_protocol_create_connection(PurpleProtocol *protocol, PurpleAccount *account, const char *password, GError **error);
 
 /**
+ * purple_protocol_get_action_menu:
+ * @protocol: The instance.
+ * @account: The account.
+ *
+ * Gets a [class@Birb.ActionMenu] for @account.
+ *
+ * Returns: (transfer full) (nullable): The new action menu or %NULL.
+ *
+ * Since: 3.0
+ */
+PURPLE_AVAILABLE_IN_3_0
+BirbActionMenu *purple_protocol_get_action_menu(PurpleProtocol *protocol, PurpleAccount *account);
+
+/**
  * purple_protocol_get_icon_name:
  * @protocol: The #PurpleProtocol instance.
  *
# HG changeset patch
# Node ID 48136fa34c530f04686bfd277083c5ec169673bf
# Parent  a227c1f6c29948f12914303bd91d91791d271bd7
diff --git a/libpurple/purpleprotocol.c b/libpurple/purpleprotocol.c
--- a/libpurple/purpleprotocol.c
+++ b/libpurple/purpleprotocol.c
@@ -385,6 +385,23 @@
 /******************************************************************************
  * Public API
  *****************************************************************************/
+BirbActionMenu *
+purple_protocol_get_action_menu(PurpleProtocol *protocol,
+                                PurpleAccount *account)
+{
+	PurpleProtocolClass *klass = NULL;
+
+	g_return_val_if_fail(PURPLE_IS_PROTOCOL(protocol), NULL);
+	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
+
+	klass = PURPLE_PROTOCOL_GET_CLASS(protocol);
+	if(klass != NULL && klass->get_action_menu != NULL) {
+		return klass->get_action_menu(protocol, account);
+	}
+
+	return NULL;
+}
+
 const gchar *
 purple_protocol_get_id(PurpleProtocol *protocol) {
 	PurpleProtocolPrivate *priv = NULL;
diff --git a/libpurple/tests/test_protocol.c b/libpurple/tests/test_protocol.c
--- a/libpurple/tests/test_protocol.c
+++ b/libpurple/tests/test_protocol.c
@@ -18,6 +18,8 @@
 
 #include <glib.h>
 
+#include <birb.h>
+
 #include <purple.h>
 
 #include "test_ui.h"
@@ -88,6 +90,16 @@
 	return g_task_propagate_boolean(G_TASK(result), error);
 }
 
+static BirbActionMenu *
+test_purple_protocol_get_action_menu(PurpleProtocol *protocol,
+                                     PurpleAccount *account)
+{
+	g_assert_true(PURPLE_IS_PROTOCOL(protocol));
+	g_assert_true(PURPLE_IS_ACCOUNT(account));
+
+	return birb_action_menu_new();
+}
+
 static void
 test_purple_protocol_finalize(GObject *obj) {
 	TestPurpleProtocol *protocol = TEST_PURPLE_PROTOCOL(obj);
@@ -111,6 +123,7 @@
 
 	protocol_class->can_connect_async = test_purple_protocol_can_connect_async;
 	protocol_class->can_connect_finish = test_purple_protocol_can_connect_finish;
+	protocol_class->get_action_menu = test_purple_protocol_get_action_menu;
 }
 
 static TestPurpleProtocol *
@@ -219,6 +232,28 @@
 	test_purple_protocol_can_connect(test_protocol);
 }
 
+static void
+test_purple_protocol_get_action_menu_valid(void) {
+	PurpleProtocol *protocol = NULL;
+	PurpleAccount *account = NULL;
+	BirbActionMenu *action_menu = NULL;
+
+	protocol = g_object_new(
+		TEST_PURPLE_TYPE_PROTOCOL,
+		"id", "test-provider",
+		"name", "Test Provider",
+		NULL);
+
+	account = purple_account_new("test", "test");
+
+	action_menu = purple_protocol_get_action_menu(protocol, account);
+	g_assert_true(BIRB_IS_ACTION_MENU(action_menu));
+	g_clear_object(&action_menu);
+
+	g_clear_object(&account);
+	g_assert_finalize_object(protocol);
+}
+
 /******************************************************************************
  * Main
  *****************************************************************************/
@@ -238,6 +273,8 @@
 	                test_purple_protocol_can_connect_false);
 	g_test_add_func("/protocol/can-connect/true",
 	                test_purple_protocol_can_connect_true);
+	g_test_add_func("/protocol/get-action-menu/valid",
+	                test_purple_protocol_get_action_menu_valid);
 
 	ret = g_test_run();
 
