diff --git a/libpurple/purplecontact.h b/libpurple/purplecontact.h
--- a/libpurple/purplecontact.h
+++ b/libpurple/purplecontact.h
@@ -48,11 +48,11 @@
 /**
  * purple_contact_new:
  * @account: The [class@Purple.Account] this contact is from.
- * @username: The username of the contact.
+ * @id: (nullable): The id of the contact.
  *
  * Creates a new [class@Purple.Contact].
  */
-PurpleContact *purple_contact_new(PurpleAccount *account, const gchar *username);
+PurpleContact *purple_contact_new(PurpleAccount *account, const gchar *id);
 
 /**
  * purple_contact_get_account:
# HG changeset patch
# Node ID e6fd5e98df21
# Parent  9da3c24cac29
diff --git a/libpurple/purplecontact.c b/libpurple/purplecontact.c
--- a/libpurple/purplecontact.c
+++ b/libpurple/purplecontact.c
@@ -343,13 +343,12 @@
  * Public API
  *****************************************************************************/
 PurpleContact *
-purple_contact_new(PurpleAccount *account, const gchar *username) {
+purple_contact_new(PurpleAccount *account, const gchar *id) {
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
-	g_return_val_if_fail(username != NULL, NULL);
 
 	return g_object_new(PURPLE_TYPE_CONTACT,
 		"account", account,
-		"username", username,
+		"id", id,
 		NULL);
 }
 
diff --git a/libpurple/purplecontactmanager.c b/libpurple/purplecontactmanager.c
--- a/libpurple/purplecontactmanager.c
+++ b/libpurple/purplecontactmanager.c
@@ -323,7 +323,8 @@
 		return NULL;
 	}
 
-	needle = purple_contact_new(account, username);
+	needle = purple_contact_new(account, NULL);
+	purple_contact_set_username(needle, username);
 	found = g_list_store_find_with_equal_func(contacts, needle,
 	                                          purple_contact_manager_find_with_username_helper,
 	                                          &position);
@@ -354,8 +355,7 @@
 		return NULL;
 	}
 
-	needle = g_object_new(PURPLE_TYPE_CONTACT, "account", account, "id", id,
-	                      NULL);
+	needle = purple_contact_new(account, id);
 	found = g_list_store_find_with_equal_func(contacts, needle,
 	                                          purple_contact_manager_find_with_id_helper,
 	                                          &position);
diff --git a/libpurple/tests/test_contact.c b/libpurple/tests/test_contact.c
--- a/libpurple/tests/test_contact.c
+++ b/libpurple/tests/test_contact.c
@@ -31,10 +31,10 @@
 	PurpleContact *contact = NULL;
 
 	account = purple_account_new("test", "test");
-	contact = purple_contact_new(account, "username");
+	contact = purple_contact_new(account, "id");
 
 	g_assert_true(purple_contact_get_account(contact) == account);
-	g_assert_cmpstr(purple_contact_get_username(contact), ==, "username");
+	g_assert_cmpstr(purple_contact_get_id(contact), ==, "id");
 
 	g_clear_object(&contact);
 	g_clear_object(&account);
@@ -69,6 +69,7 @@
 	contact = g_object_new(
 		PURPLE_TYPE_CONTACT,
 		"account", account,
+		"id", "id1",
 		"username", "username",
 		"display-name", "display-name",
 		"alias", "alias",
@@ -91,7 +92,7 @@
 		NULL);
 
 	/* Compare all the things. */
-	g_assert_nonnull(id);
+	g_assert_cmpstr(id, ==, "id1");
 	g_assert_true(account1 == account);
 	g_assert_cmpstr(username, ==, "username");
 	g_assert_cmpstr(display_name, ==, "display-name");
diff --git a/libpurple/tests/test_contact_manager.c b/libpurple/tests/test_contact_manager.c
--- a/libpurple/tests/test_contact_manager.c
+++ b/libpurple/tests/test_contact_manager.c
@@ -198,10 +198,12 @@
 
 	account = purple_account_new("test", "test");
 
-	contact1 = purple_contact_new(account, "user1");
+	contact1 = purple_contact_new(account, NULL);
+	purple_contact_set_username(contact1, "user1");
 	purple_contact_manager_add(manager, contact1);
 
-	contact2 = purple_contact_new(account, "user2");
+	contact2 = purple_contact_new(account, NULL);
+	purple_contact_set_username(contact2, "user2");
 	purple_contact_manager_add(manager, contact2);
 
 	found = purple_contact_manager_find_with_username(manager, account,
@@ -235,12 +237,10 @@
 
 	account = purple_account_new("test", "test");
 
-	contact1 = g_object_new(PURPLE_TYPE_CONTACT, "account", account, "id",
-	                        "id-1", NULL);
+	contact1 = purple_contact_new(account, "id-1");
 	purple_contact_manager_add(manager, contact1);
 
-	contact2 = g_object_new(PURPLE_TYPE_CONTACT, "account", account, "id",
-	                        "id-2", NULL);
+	contact2 = purple_contact_new(account, "id-2");
 	purple_contact_manager_add(manager, contact2);
 
 	found = purple_contact_manager_find_with_id(manager, account, "id-1");
