diff --git a/libpurple/purplecontactinfo.h b/libpurple/purplecontactinfo.h
--- a/libpurple/purplecontactinfo.h
+++ b/libpurple/purplecontactinfo.h
@@ -203,6 +203,34 @@
 void purple_contact_info_set_alias(PurpleContactInfo *info, const gchar *alias);
 
 /**
+ * purple_contact_info_get_color:
+ * @info: The instance.
+ *
+ * Gets the color that should be used to render this contact info. This is a
+ * RGB hex code in a string format.
+ *
+ * Returns: The RGB hex code.
+ *
+ * Since: 3.0.0
+ */
+const char *purple_contact_info_get_color(PurpleContactInfo *info);
+
+/**
+ * purple_contact_info_set_color:
+ * @info: The instance.
+ * @color: The RGB hex code to set.
+ *
+ * Sets the color to use when rendering @info to @color.
+ *
+ * @color should start with a `#` and have a valid number of hex digits
+ * following it. Different user interfaces may be able to handle additional
+ * precision, but using `#RRGGBB` will have the highest compatibility.
+ *
+ * Since: 3.0.0
+ */
+void purple_contact_info_set_color(PurpleContactInfo *info, const char *color);
+
+/**
  * purple_contact_info_get_avatar:
  * @info: The instance.
  *
# HG changeset patch
# Node ID 75961558aea4
# Parent  aaf28c77ff60
diff --git a/libpurple/purplecontactinfo.c b/libpurple/purplecontactinfo.c
--- a/libpurple/purplecontactinfo.c
+++ b/libpurple/purplecontactinfo.c
@@ -27,6 +27,7 @@
 	gchar *username;
 	gchar *display_name;
 	gchar *alias;
+	gchar *color;
 
 	GdkPixbuf *avatar;
 
@@ -45,6 +46,7 @@
 	PROP_USERNAME,
 	PROP_DISPLAY_NAME,
 	PROP_ALIAS,
+	PROP_COLOR,
 	PROP_AVATAR,
 	PROP_PRESENCE,
 	PROP_TAGS,
@@ -80,6 +82,9 @@
 		case PROP_ALIAS:
 			g_value_set_string(value, purple_contact_info_get_alias(info));
 			break;
+		case PROP_COLOR:
+			g_value_set_string(value, purple_contact_info_get_color(info));
+			break;
 		case PROP_AVATAR:
 			g_value_set_object(value, purple_contact_info_get_avatar(info));
 			break;
@@ -121,6 +126,9 @@
 		case PROP_ALIAS:
 			purple_contact_info_set_alias(info, g_value_get_string(value));
 			break;
+		case PROP_COLOR:
+			purple_contact_info_set_color(info, g_value_get_string(value));
+			break;
 		case PROP_AVATAR:
 			purple_contact_info_set_avatar(info, g_value_get_object(value));
 			break;
@@ -257,6 +265,22 @@
 		G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
 	/**
+	 * PurpleContactInfo:color:
+	 *
+	 * The color for this contact. This is an RGB hex code that user interfaces
+	 * can use when rendering the contact. This may also be controlled via a
+	 * protocol plugin in the event that the protocol allows people to set a
+	 * highlight/branding color.
+	 *
+	 * Since: 3.0.0
+	 */
+	properties[PROP_COLOR] = g_param_spec_string(
+		"color", "color",
+		"The color to use when rendering the contact.",
+		NULL,
+		G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	/**
 	 * PurpleContactInfo:avatar:
 	 *
 	 * The avatar for this contact. This is typically controlled by the protocol
@@ -442,6 +466,33 @@
 	g_object_notify_by_pspec(G_OBJECT(info), properties[PROP_ALIAS]);
 }
 
+const char *
+purple_contact_info_get_color(PurpleContactInfo *info) {
+	PurpleContactInfoPrivate *priv = NULL;
+
+	g_return_val_if_fail(PURPLE_IS_CONTACT_INFO(info), NULL);
+
+	priv = purple_contact_info_get_instance_private(info);
+
+	return priv->color;
+}
+
+void
+purple_contact_info_set_color(PurpleContactInfo *info, const char *color) {
+	PurpleContactInfoPrivate *priv = NULL;
+
+	g_return_if_fail(PURPLE_IS_CONTACT_INFO(info));
+
+	priv = purple_contact_info_get_instance_private(info);
+
+	if(!purple_strequal(priv->color, color)) {
+		g_free(priv->color);
+		priv->color = g_strdup(color);
+
+		g_object_notify_by_pspec(G_OBJECT(info), properties[PROP_COLOR]);
+	}
+}
+
 GdkPixbuf *
 purple_contact_info_get_avatar(PurpleContactInfo *info) {
 	PurpleContactInfoPrivate *priv = NULL;
diff --git a/libpurple/tests/test_contact_info.c b/libpurple/tests/test_contact_info.c
--- a/libpurple/tests/test_contact_info.c
+++ b/libpurple/tests/test_contact_info.c
@@ -50,6 +50,7 @@
 	gchar *username = NULL;
 	gchar *display_name = NULL;
 	gchar *alias = NULL;
+	gchar *color = NULL;
 
 	avatar = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, 1, 1);
 	person = purple_person_new();
@@ -64,6 +65,7 @@
 		"username", "username",
 		"display-name", "display-name",
 		"alias", "alias",
+		"color", "#e9c636",
 		"avatar", avatar,
 		"person", person,
 		"permission", PURPLE_CONTACT_INFO_PERMISSION_ALLOW,
@@ -75,6 +77,7 @@
 		"username", &username,
 		"display-name", &display_name,
 		"alias", &alias,
+		"color", &color,
 		"avatar", &avatar1,
 		"presence", &presence1,
 		"tags", &tags,
@@ -87,6 +90,7 @@
 	g_assert_cmpstr(username, ==, "username");
 	g_assert_cmpstr(display_name, ==, "display-name");
 	g_assert_cmpstr(alias, ==, "alias");
+	g_assert_cmpstr(color, ==, "#e9c636");
 	g_assert_true(avatar1 == avatar);
 	g_assert_nonnull(presence1);
 	g_assert_nonnull(tags);
@@ -98,6 +102,7 @@
 	g_clear_pointer(&username, g_free);
 	g_clear_pointer(&display_name, g_free);
 	g_clear_pointer(&alias, g_free);
+	g_clear_pointer(&color, g_free);
 	g_clear_object(&avatar1);
 	g_clear_object(&presence1);
 	g_clear_object(&tags);
