diff --git a/src/actions/members.js b/src/actions/members.js
index 4cc23a1c..817ad5be 100644
--- a/src/actions/members.js
+++ b/src/actions/members.js
@@ -143,6 +143,7 @@ async function getActiveChallengesInit(handle, uuid) {
  * @param {String} tokenV3
  * @returns {Object} Payload
  */
+/* eslint-disable no-unused-vars */
 async function getActiveChallengesDone(handle, uuid, tokenV3) {
   const filter = { status: 'Active' };
   const service = getChallengesService(tokenV3);
@@ -168,6 +169,38 @@ async function getActiveChallengesDone(handle, uuid, tokenV3) {
 
   return { handle, challenges, uuid };
 }
+/* eslint-enable no-unused-vars */
+
+/**
+ * @static
+ * @desc Payload creator for the action that loads the member active challenges from v4 api.
+ * @param {String} handle
+ * @param {String} uuid
+ * @param {String} tokenV3
+ * @returns {Object} Payload
+ */
+async function getActiveChallengesV4Done(handle, uuid, tokenV3) {
+  const filter = { status: 'Active' };
+  const service = getChallengesService(tokenV3);
+
+  function getAll(getter, page = 0, prev = null) {
+    const PAGE_SIZE = 50;
+    return getter({
+      limit: PAGE_SIZE,
+      offset: page * PAGE_SIZE,
+    }).then(({ challenges: chunk }) => {
+      if (!chunk.length) return prev || [];
+      return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk);
+    });
+  }
+  const calls = [
+    getAll(params => service.getUserChallengesV4(handle, filter, params)),
+  ];
+
+  const [challenges] = await Promise.all(calls);
+
+  return { handle, challenges, uuid };
+}
 
 /**
  * @static
@@ -243,6 +276,7 @@ async function getSubtrackChallengesInit(handle, uuid) {
  * @param {Boolean} whether to refresh.
  * @return {Action}
  */
+/* eslint-disable no-unused-vars */
 async function getSubtrackChallengesDone(
   uuid, handle, tokenV3, track, subTrack, pageNum, pageSize,
   refresh, userId,
@@ -268,6 +302,46 @@ async function getSubtrackChallengesDone(
       handle,
     }));
 }
+/* eslint-enable no-unused-vars */
+
+/**
+ * @static
+ * @desc Create an action that loads the member subtrack challenges from v4 api.
+ * @param {String} uuid Operation UUID.
+ * @param {String} handle Member handle.
+ * @param {String} tokenV3 v3 auth token.
+ * @param {String} track Main track name.
+ * @param {String} subTrack Subtrack name.
+ * @param {Number} start page.
+ * @param {Number} page size.
+ * @param {Boolean} whether to refresh.
+ * @return {Action}
+ */
+async function getSubtrackChallengesV4Done(
+  uuid, handle, tokenV3, track, subTrack, pageNum, pageSize,
+  refresh,
+) {
+  const filter = {
+    status: 'Completed',
+    hasUserSubmittedForReview: 'true',
+    track,
+    subTrack,
+  };
+
+  const params = {};
+  params.orderBy = 'submissionEndDate desc';
+  params.limit = pageSize;
+  params.offset = (pageNum - 1) * pageSize; // pageNum - 1 to match with v4 offset
+
+  const service = getChallengesService(tokenV3);
+  return service.getUserChallengesV4(handle, filter, params)
+    .then(res => ({
+      uuid,
+      challenges: res.challenges,
+      refresh,
+      handle,
+    }));
+}
 
 /**
  * @static
@@ -399,9 +473,9 @@ export default createActions({
     GET_STATS_DISTRIBUTION_INIT: getStatsDistributionInit,
     GET_STATS_DISTRIBUTION_DONE: getStatsDistributionDone,
     GET_ACTIVE_CHALLENGES_INIT: getActiveChallengesInit,
-    GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesDone,
+    GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesV4Done,
     GET_SUBTRACK_CHALLENGES_INIT: getSubtrackChallengesInit,
-    GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesDone,
+    GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesV4Done,
     GET_USER_SRM_INIT: getUserSRMInit,
     GET_USER_SRM_DONE: getUserSRMDone,
     GET_USER_MARATHON_INIT: getUserMarathonInit,
diff --git a/src/services/challenges.js b/src/services/challenges.js
index e232274b..1aa7b98e 100644
--- a/src/services/challenges.js
+++ b/src/services/challenges.js
@@ -572,6 +572,25 @@ class ChallengesService {
     };
   }
 
+  /**
+   * Gets challenges of the specified user from v4 api.
+   * @param {String} username User name whose challenges we want to fetch.
+   * @return {Promise} Resolves to the api response.
+   */
+  async getUserChallengesV4(username, filters, params) {
+    const endpoint = `/members/${username.toLowerCase()}/challenges/`;
+    const query = {
+      filter: qs.stringify(filters, { encode: false }),
+      ...params,
+    };
+    const url = `${endpoint}?${qs.stringify(query)}`;
+    const res = await this.private.api.get(url).then(checkError);
+    return {
+      challenges: res.content || [],
+      totalCount: res.metadata.totalCount,
+    };
+  }
+
   /**
    * Gets user resources.
    * @param {String} userId User id whose challenges we want to fetch.