diff --git a/admin/admin-service/pom.xml b/admin/admin-service/pom.xml
index b5dc1da0591..19014fe21dd 100644
--- a/admin/admin-service/pom.xml
+++ b/admin/admin-service/pom.xml
@@ -186,6 +186,22 @@
+
+ io.mosip.kernel
+ kernel-cbeffutil-api
+ 1.2.0
+
+
+ io.mosip.biometric.util
+ biometrics-util
+ 1.2.0
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+
+
+
diff --git a/admin/admin-service/src/main/java/io/mosip/admin/bulkdataupload/entity/ApplicantUserDetailsEntity.java b/admin/admin-service/src/main/java/io/mosip/admin/bulkdataupload/entity/ApplicantUserDetailsEntity.java
new file mode 100644
index 00000000000..7d31deb6f18
--- /dev/null
+++ b/admin/admin-service/src/main/java/io/mosip/admin/bulkdataupload/entity/ApplicantUserDetailsEntity.java
@@ -0,0 +1,28 @@
+package io.mosip.admin.bulkdataupload.entity;
+
+import lombok.Data;
+import org.hibernate.annotations.GenericGenerator;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@Entity
+@Table(name = "applicant_login_detail", schema = "master")
+public class ApplicantUserDetailsEntity extends BaseEntity implements Serializable {
+
+ private static final long serialVersionUID = -8541947587557590379L;
+
+ @Id
+ @GeneratedValue(generator = "uuid")
+ @GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
+ @Column(name = "id", nullable = false, length = 64)
+ private String id;
+
+ @Column(name = "usr_id", nullable = false, length = 64)
+ private String userId;
+
+ @Column(name = "login_date")
+ private LocalDate loginDate;
+
+}
\ No newline at end of file
diff --git a/admin/admin-service/src/main/java/io/mosip/admin/bulkdataupload/entity/ApplicantUserDetailsRepository.java b/admin/admin-service/src/main/java/io/mosip/admin/bulkdataupload/entity/ApplicantUserDetailsRepository.java
new file mode 100644
index 00000000000..c2d5ab97f42
--- /dev/null
+++ b/admin/admin-service/src/main/java/io/mosip/admin/bulkdataupload/entity/ApplicantUserDetailsRepository.java
@@ -0,0 +1,18 @@
+package io.mosip.admin.bulkdataupload.entity;
+
+import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDate;
+
+/**
+ * @author Dhanendra
+ *
+ */
+@Repository
+public interface ApplicantUserDetailsRepository extends BaseRepository {
+
+
+ long countByUserIdAndLoginDate(String userId, LocalDate loginDate);
+
+}
\ No newline at end of file
diff --git a/admin/admin-service/src/main/java/io/mosip/admin/constant/ApplicantDetailErrorCode.java b/admin/admin-service/src/main/java/io/mosip/admin/constant/ApplicantDetailErrorCode.java
new file mode 100644
index 00000000000..5861f11759f
--- /dev/null
+++ b/admin/admin-service/src/main/java/io/mosip/admin/constant/ApplicantDetailErrorCode.java
@@ -0,0 +1,32 @@
+package io.mosip.admin.constant;
+
+public enum ApplicantDetailErrorCode {
+
+ UNABLE_TO_RETRIEVE_RID_DETAILS("ADM-AVD-001", "A technical error occurred while retrieving the data, please try again after some time."),
+ RID_INVALID("ADM-AVD-002","RID is invalid"),
+ RID_NOT_FOUND("ADM-AVD-003","The card for this request ID is not generated. Please check the status of the ID."),
+ DATA_NOT_FOUND("ADM-AVD-004","Applicant Photo Not Found"),
+ DIGITAL_CARD_RID_NOT_FOUND("ADM-AVD-005", "Digital card not found for the RID, please try after few days"),
+ DIGITAL_CARD_NOT_ACKNOWLEDGED("ADM-AVD-006", "Please acknowledge the details before downloading digital card"),
+ REQ_ID_NOT_FOUND("ADM-AVD-007","Request id not found"),
+
+ LIMIT_EXCEEDED("ADM-AVD-008","Your daily search limit has exceeded. Please try searching again tomorrow."),
+
+ DATA_SHARE_EXPIRED_EXCEPTION("ADM-AVD-008", "Data share usuage expired");
+
+ private final String errorCode;
+ private final String errorMessage;
+
+ private ApplicantDetailErrorCode(final String errorCode, final String errorMessage) {
+ this.errorCode = errorCode;
+ this.errorMessage = errorMessage;
+ }
+
+ public String getErrorCode() {
+ return errorCode;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+}
\ No newline at end of file
diff --git a/admin/admin-service/src/main/java/io/mosip/admin/controller/ApplicantDetailsController.java b/admin/admin-service/src/main/java/io/mosip/admin/controller/ApplicantDetailsController.java
new file mode 100644
index 00000000000..4a51ca7ee5f
--- /dev/null
+++ b/admin/admin-service/src/main/java/io/mosip/admin/controller/ApplicantDetailsController.java
@@ -0,0 +1,66 @@
+package io.mosip.admin.controller;
+
+import io.mosip.admin.dto.ApplicantDetailsDto;
+import io.mosip.admin.dto.ApplicantUserDetailsDto;
+import io.mosip.admin.packetstatusupdater.util.AuditUtil;
+import io.mosip.admin.packetstatusupdater.util.EventEnum;
+import io.mosip.admin.service.ApplicantDetailService;
+import io.mosip.kernel.core.http.ResponseWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.ByteArrayInputStream;
+
+@RestController
+public class ApplicantDetailsController {
+
+ @Autowired
+ AuditUtil auditUtil;
+
+ @Autowired
+ ApplicantDetailService applicantDetailService;
+
+ //@PreAuthorize("hasRole(''ZONAL_ADMIN','GLOBAL_ADMIN'')")
+ @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpacketstatusupdate())")
+ @GetMapping("/applicantDetails/{rid}")
+ public ResponseWrapper getApplicantDetails(@PathVariable("rid") String rid) throws Exception {
+ auditUtil.setAuditRequestDto(EventEnum.APPLICANT_VERIFICATION_API_CALLED,null);
+ ResponseWrapper responseWrapper = new ResponseWrapper<>();
+ responseWrapper.setResponse(applicantDetailService.getApplicantDetails(rid));
+ auditUtil.setAuditRequestDto(EventEnum.APPLICANT_VERIFICATION_SUCCESS,null);
+ return responseWrapper;
+ }
+
+ // @PreAuthorize("hasRole(''ZONAL_ADMIN','GLOBAL_ADMIN'')")
+ @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpacketstatusupdate())")
+ @GetMapping("/applicantDetails/getLoginDetails")
+ public ResponseWrapper getApplicantUserDetails() throws Exception {
+ auditUtil.setAuditRequestDto(EventEnum.APPLICANT_LOGIN_DETAILS_API_CALLED,null);
+ ResponseWrapper responseWrapper = new ResponseWrapper<>();
+ responseWrapper.setResponse(applicantDetailService.getApplicantUserDetails());
+ auditUtil.setAuditRequestDto(EventEnum.APPLICANT_LOGIN_DETAILS_SUCCESS,null);
+ return responseWrapper;
+ }
+
+ // @PreAuthorize("hasRole(''ZONAL_ADMIN','GLOBAL_ADMIN'')")
+ @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpacketstatusupdate())")
+ @GetMapping("/rid-digital-card/{rid}")
+ public ResponseEntity