diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientAccount.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientAccount.java
index 5baa465..8004845 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientAccount.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientAccount.java
@@ -1,16 +1,16 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit;
 
-import com.google.gson.JsonArray;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.server.util.ManualRequestContext;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
-import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.UriResourceLocator;
 import lombok.extern.slf4j.Slf4j;
 
-import java.net.URI;
+import static java.util.stream.Collectors.toList;
+
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
 
 @Slf4j
 public class GerritClientAccount extends GerritClientBase {
@@ -37,11 +37,12 @@
     }
 
     protected Optional<Integer> getAccountId(String authorUsername) {
-        URI uri = URI.create(config.getGerritAuthBaseUrl()
-                + UriResourceLocator.gerritAccountIdUri(authorUsername));
-        try {
-            JsonArray responseArray = forwardGetRequestReturnJsonArray(uri);
-            return Optional.of(responseArray.get(0).getAsJsonObject().get("_account_id").getAsInt());
+        try (ManualRequestContext requestContext = config.openRequestContext()) {
+            List<AccountInfo> accounts = config.getGerritApi().accounts().query(authorUsername).get();
+            if (accounts.isEmpty()) {
+                return Optional.empty();
+            }
+            return Optional.of(accounts.get(0)).map(a -> a._accountId);
         }
         catch (Exception e) {
             log.error("Could not find account ID for username '{}'", authorUsername);
@@ -55,14 +56,9 @@
     }
 
     private List<String> getAccountGroups(Integer accountId) {
-        URI uri = URI.create(config.getGerritAuthBaseUrl()
-                + UriResourceLocator.gerritAccountsUri()
-                + UriResourceLocator.gerritGroupPostfixUri(accountId));
-        try {
-            JsonArray responseArray = forwardGetRequestReturnJsonArray(uri);
-            return StreamSupport.stream(responseArray.spliterator(), false)
-                    .map(jsonElement -> jsonElement.getAsJsonObject().get("name").getAsString())
-                    .collect(Collectors.toList());
+        try (ManualRequestContext requestContext = config.openRequestContext()) {
+            List<GroupInfo> groups = config.getGerritApi().accounts().id(accountId).getGroups();
+            return groups.stream().map(g -> g.name).collect(toList());
         }
         catch (Exception e) {
             log.error("Could not find groups for account ID {}", accountId);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
index b252280..7139ee6 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
@@ -12,9 +12,14 @@
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.account.AccountState;
 import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.accounts.AccountApi;
+import com.google.gerrit.extensions.api.accounts.Accounts;
+import com.google.gerrit.extensions.api.accounts.Accounts.QueryRequest;
 import com.google.gerrit.extensions.api.changes.ChangeApi;
 import com.google.gerrit.extensions.api.changes.Changes;
+import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.json.OutputFormat;
 import com.google.gerrit.server.config.PluginConfig;
@@ -36,7 +41,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.data.PluginDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.listener.EventHandlerTask;
 import com.googlesource.gerrit.plugins.chatgpt.listener.GerritEventContextModule;
-import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.UriResourceLocator;
+import com.google.inject.TypeLiteral;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientFacade;
@@ -169,27 +174,15 @@
     protected void setupMockRequests() throws RestApiException {
         String fullChangeId = getGerritChange().getFullChangeId();
 
+        Accounts accountsMock = mockGerritAccountsRestEndpoint();
         // Mock the behavior of the gerritAccountIdUri request
-        WireMock.stubFor(WireMock.get(gerritAccountIdUri(GERRIT_GPT_USERNAME))
-                .willReturn(WireMock.aResponse()
-                        .withStatus(HTTP_OK)
-                        .withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString())
-                        .withBody("[{\"_account_id\": " + GERRIT_GPT_ACCOUNT_ID + "}]")));
+        mockGerritAccountsQueryApiCall(accountsMock, GERRIT_GPT_USERNAME, GERRIT_GPT_ACCOUNT_ID);
 
         // Mock the behavior of the gerritAccountIdUri request
-        WireMock.stubFor(WireMock.get(gerritAccountIdUri(GERRIT_USER_USERNAME))
-                .willReturn(WireMock.aResponse()
-                        .withStatus(HTTP_OK)
-                        .withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString())
-                        .withBody("[{\"_account_id\": " + GERRIT_USER_ACCOUNT_ID + "}]")));
+        mockGerritAccountsQueryApiCall(accountsMock, GERRIT_USER_USERNAME, GERRIT_USER_ACCOUNT_ID);
 
         // Mock the behavior of the gerritAccountGroups request
-        WireMock.stubFor(WireMock.get(UriResourceLocator.gerritAccountsUri() +
-                        gerritGroupPostfixUri(GERRIT_USER_ACCOUNT_ID))
-                .willReturn(WireMock.aResponse()
-                        .withStatus(HTTP_OK)
-                        .withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString())
-                        .withBodyFile("gerritAccountGroups.json")));
+        mockGerritAccountGroupsApiCall(accountsMock, GERRIT_USER_ACCOUNT_ID);
 
         // Mock the behavior of the gerritPatchSetRevisionsUri request
         WireMock.stubFor(WireMock.get(gerritPatchSetRevisionsUri(fullChangeId))
@@ -204,7 +197,7 @@
                         .withStatus(HTTP_OK)
                         .withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString())
                         .withBodyFile("gerritPatchSetDetail.json")));
-        mockGerritApi();
+        mockGerritChangeDetailsApiCall();
 
         // Mock the behavior of the gerritPatchSet comments request
         WireMock.stubFor(WireMock.get(gerritGetAllPatchSetCommentsUri(fullChangeId))
@@ -219,7 +212,32 @@
                         .withStatus(HTTP_OK)));
     }
 
-    private void mockGerritApi() throws RestApiException {
+    private Accounts mockGerritAccountsRestEndpoint() {
+        Accounts accountsMock = mock(Accounts.class);
+        when(gerritApi.accounts()).thenReturn(accountsMock);
+        return accountsMock;
+    }
+
+    private void mockGerritAccountsQueryApiCall(
+        Accounts accountsMock, String username, int expectedAccountId) throws RestApiException {
+        QueryRequest queryRequestMock = mock(QueryRequest.class);
+        when(accountsMock.query(username)).thenReturn(queryRequestMock);
+        when(queryRequestMock.get()).thenReturn(List.of(new AccountInfo(expectedAccountId)));
+    }
+
+    private void mockGerritAccountGroupsApiCall(Accounts accountsMock, int accountId)
+        throws RestApiException {
+        Gson gson = OutputFormat.JSON.newGson();
+        List<GroupInfo> groups =
+            gson.fromJson(
+                readTestFile("__files/gerritAccountGroups.json"),
+                new TypeLiteral<List<GroupInfo>>() {}.getType());
+        AccountApi accountApiMock = mock(AccountApi.class);
+        when(accountsMock.id(accountId)).thenReturn(accountApiMock);
+        when(accountApiMock.getGroups()).thenReturn(groups);
+    }
+
+    private void mockGerritChangeDetailsApiCall() throws RestApiException {
         Gson gson = OutputFormat.JSON.newGson();
         ChangeInfo changeInfo = gson.fromJson(readTestFile("__files/gerritPatchSetDetail.json"), ChangeInfo.class);
         Changes changesMock = mock(Changes.class);
