HyperSecure is an iOS Framework of HyperVerge's Face Recognition based Identity and Access Management (IAM) System. This documentation explains how to use the framework to build your own app.
In the context of HyperVerge's face recognition based IAM system, there are 3 entities: User, Group and Organization. Users are the people enrolled for Face Recognition having registered with their face image. A Group can represent a team or site or location or building or any other collection of people. An Organization can thus have multiple Groups and each Group can have multiple Users.
A high-level overview of the Face Recognition workflow is as follows:
- Enroll Users into a Group of the Organization, with their face images captured from Camera in Registration Mode
- To recognize who a person is, capture their face image from the Camera in Recognition Mode
- To verify if a person is actually who they're claiming to be, capture their face from the Camera in Verification Mode along with the userId
- To add more faces to a person to improve recognition accuracy, capture their face images from the Camera in Face Add Mode
- Minimum iOS Deployment Target - iOS 8.0
- Please refer to the example app provided in the repo to get an understanding of the implementation process.
- To run the app, clone/download the repo and open example/HyperSecure.xcworkspace.
- Set the tenantID, tenantKey, admin token and groupID in
Constants.swift
. These values are discussed in the next section. - Build and run the app.
- Using HyperSecure within your own organization: Please use the
tenantId
,tenantKey
andadminToken
supplied by HyperVerge. If you don't have them already, drop a mail to contact@hyperverge.co - Using HyperSecure for other organizations: Channel Partners using HyperSecure as part of solutions for other organizations shall use a dashboard or an API provided by HyperVerge to create a client organization. Upon creation, they will receive a
tenantId
,tenantKey
andadminToken
unique to each client organization, which shall be used in the SDK initialization as described later.- tenantId: An id unique to each client of the Channel Partner. It will be used to identify the client organization and will let HyperVerge know which logical organization entity is being referred to for performing operations such as face enrollment, verification or recognition
- tenantKey: A token used to authenticate a client of the Channel Partner. This will help HyperVerge ensure that all the communication to the server is secure and authenticated.
- adminToken: A unique Admin Token for each client organisation's admin user. This token will let HyperVerge authorize the FR operations requested by the SDK at the Server
HyperSecureSDK is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'HyperSecureSDK'
- Download 'HyperSecureSDK.framework' and add it to your Xcode project
- Navigate to Targets -> General and include the framework under 'Embedded Binaries' and 'Linked Frameworks and Libraries'.
- Navigate to Targets -> 'Your App name' -> Build Settings. Ensure that 'Always Embed Swift Standard Libraries' is set to 'Yes'.
Permissions: To request the user for camera permissions, add this key-value pair in your application's info.plist file.
Key: Privacy - Camera Usage Description
Value: "This is a face based access control application. In order to capture face, we need camera access."
The same in xml would be:
<key>NSCameraUsageDescription</key>
<string>"This is a face based access control application. In order to capture face, we need camera access."</string>
Add this import statement in all files using the framework.
Objective C: @import HyperSecureSDK;
Swift: import HyperSecureSDK
SDK Initialization: Add the following line to your code for initializing the Library. This must be called before launching the camera. So, preferably in 'viewDidLoad' of the ViewController or 'applicationDidFinishLaunching' in the AppDelegate.
Objective C:
[HyperSecureSDK initializeWithTenantId:@<tenantId> tenantKey:@<tenantKey> adminToken:@<adminToken>];
Swift:
HyperSecureSDK.initialize(tenantId: <tenantId>, tenantKey: <tenantKey>, adminToken: <adminToken>)
The functionality for enrolling, verifying and recognizing a user is implemented in the SDK as a View called HVFrCamera
. This View includes a camera preview, local face detection and execution of corresponding APIs for enrollment, verification (1:1) and recognition (1:N).
-
Adding via Storyboard/xib:
Add a UIView to the storyboard/xib. Under identity inspector, set the class name to 'HVFrCamera' and module to 'HyperSecureSDK'. Add an @IBOutlet of this view to your ViewController class. Set layout constraints/frame(using autoLayout/code).
Please note: The default camera selected is the front camera. If you want to use the back camera instead, include the following line inviewDidLoad
(This extra step is not required if the view is created in code).Objective C:
[_hvfrcamera shouldUseFrontCam:false]
Swift:
hvfrcamera.shouldUseFrontCam(false)
-
Adding via Code:
Create a HVFRCamera instance by calling the following.Objective C:
HVFrCamera *hvfrcamera = [[HVFrCamera alloc] initWithFrontCam:<true/false>] [self.view addSubview:hvfrcamera];
Swift:
let hvfrcamera = HVFrCamera(frontCam: <true/false>) self.view.addSubview(hvfrcamera)
Set layout constraints/frame of hvfrcamera.
Please note:
If the Application supports multiple orientations, add the following to the 'viewWillLayoutSubviews' function of the corresponding ViewController.
Objective C:
[hvfrcamera updateCameraOrientation]
Swift:
hvfrcamera.updateCameraOrientation()
To start the camera and face detection, add the following to the 'viewWillAppear' function of the corresponding ViewController.
Objective C:
[_hvfrcamera startCameraWithUserData:userData mode:mode timeout:timeout autoCaptureEnabled:isAutoCaptureEnabled useFrontCam:useFrontCam completionHandler:completionHandler];
Swift:
hvfrcamera.startCamera(userData: userData, mode: mode, timeout: timeout, autoCaptureEnabled: isAutoCaptureEnabled, useFrontCam: useFrontCam,completionHandler: completionHandler)
The arguments accepted by the start camera function are the Configuration variables for HVFrCamera. The startCamera()
method will set these variables and set HVFrCamera to start processing the camera feed. The details of the variables are given below.
mode
can have a value among FRMode.REGISTER, FRMode.FACE_ADD, FRMode.RECOGNITION, FRMode.VERIFICATION and FRMode.CAPTUREuserData
is a dictionary with the userDetails (explanation below)timeout
is the maximum time in milliseconds since startCamera() or resumeCamera() after which if the registration/recognition is not done, the onError will be called with Timeout Error. A value of 0 will disable the timeoutisAutoCaptureEnabled
is a boolean value that specifies if automatic capture of image should happen for recognition when a face matching the desired size is detected. Please note that auto-capture is not supported for Registration mode or Face Add modeuseFrontCam
is a boolean value that specifies if the front camera should be used. If set to false, then the back camera will be used for processingcompletionHandler
- discussed in the next section.
UserData Dictionary:
- Enroll Mode:
tenantId
: Used to identify the organization where enroll should be performed. Should be same as the one used to initialize the SDKgroupId
: Group to which the user should be enrolled (Optional)userId
: Unique id of the user who is getting enrolleduserInfo
: Some more information about the user
- Face Add Mode:
tenantId
: Used to identify the organization where face add should be performed. Should be same as the one used to initialize the SDKuserId
: Unique id of the user whose face is getting added
- Verification Mode:
tenantId
: Used to identify the organization where Verification should be performed. Should be same as the one used to initialize the SDKgroupId
: Group where Verification should be performed (Optional)userId
: Unique id of the user on whom Verification should performed
- Recognition Mode:
tenantId
: Used to identify the organization where Recognition should be performed. Should be same as the one used to initialize the SDKgroupId
: Group where Recognition should be performed
- Capture Mode:
- An empty dictionary
Please note: the group will have to be created before use in HVFrCamera. If no groupId is passed, we will assume that default
group is being used. The default
group is by default created for all tenants upon creation of the tenant
HVFrCamera communicates with your application through the closure you pass to the startCamera
method.
This closure should be of type error:NSError?, result:[String:AnyObject]?) -> Void
and should be implemented in the application.
The values of error
and result
received by the closure determine whether the call was a success or failure.
error
: If the call was successful, the error is set tonil
. Otherwise, it is anNSError
object with following informationcode
: Error code stating type of error. (discussed later)userInfo
: A dictionary of type[String:Any]
.- The key
NSLocalizedDescriptionKey
has the error description. - If the error is received after capture, this dictionary also contains
imageUri
- an array of strings representing the local paths of the captured face images.
- The key
result
: If the call failed, this is set tonil
. Otherwise, it is of type[String:AnyObject]
. Following are the values obtained in various modes.
Please note: In case of an error in REGISTRAION
or FACE_ADD
modes, the captured images won't be cleared internally by the SDK. This essentially means that the state of images captured will be preserved and if submit
method is called again, the same images will be processed and uploaded to the server.
If these captured images need to be cleared, clearCapturedImages
method(described later) should be called to manually clear them.
- Result Dictionary:
- Enroll Mode:
tenantId
: Used to identify the organization where enroll has been performed.groupId
: Group to which the user has been enrolleduserId
: Unique id of the user who has been enrolleduserInfo
: Some more details about the userimageUri
: Array of local file paths(String) of the face images that have been used for enrollingfaceIds
: Array of faceIds of the faces enrolled
- Face Add Mode:
tenantId
: Used to identify the organization where face add has been performed.userId
: Unique id of the user whose face is getting addedimageUri
: Array of local file paths(String) of the face images that have been added to the user's facelistfaceIds
: Array of faceIds of the faces added to the user
- Verification Mode:
tenantId
: Used to identify the organization where verification has been performed.userId
: Unique id of the user on whom verification has been performeduserInfo
: Some more details about the userimageUri
: Array with one string that represents the local file path of the face image on which Verification has been performed
- Recognition Mode:
tenantId
: Used to identify the organization where Recognition has been performed.groupId
: Group in which Recognition has been performeduserId
: Unique id of the user recognized by RecognitionuserInfo
: Some more details about the userimageUri
: Array with one string that represents the local file path of the face image on which user has been recognized
- Capture Mode:
imageUri
: Array with one string that represents the local file path of the face image captured
- Enroll Mode:
To pause or resume processing the camera feed for face detection and recognition, the following functions can be used.
hvfrcamera.pauseFR()
or[hvfrcamera pauseFR]
will pause the Face Detection and auto-capture of faceshvfrcamera.resumeFR()
or[hvfrcamera resumeFR]
will resume the Face Detection and auto-capture of faces(if applicable).
By default, the brightness of the screen is set to 100% in an active session. To turn this feature off, call the following method before calling startCamera
Objective C:
[hvfrcamera enableDisableFullBrightness:false];
Swift:
hvfrcamera.enableDisableFullBrightness(shouldEnable: false)
If any of the configuration variables need to be changed at runtime, after startCamera()
has been called, we can use the setter functions corresponding to the variables after the face processing has been safely paused with pauseFR()
.
Objective C:
[hvfrcamera pauseFR]
[hvfrcamera setUserData:userData]
[hvfrcamera setMode:mode]
[hvfrcamera setTimeout:timeout]
[hvfrcamera setAutoCaptureEnabled:isAutoCaptureEnabled]
[hvfrcamera setCompletionHandler:completionHandler]
[hvfrcamera shouldUseFrontCam:useFrontCam]
[hvfrcamera resumeFR]
Swift:
hvfrcamera.pauseFR()
hvfrcamera.setUserData(userData)
hvfrcamera.setMode(mode)
hvfrcamera.setTimeout(timeout)
hvfrcamera.setAutoCaptureEnabled(isAutoCaptureEnabled)
hvfrcamera.setCompletionHandler(completionHandler)
hvfrcamera.shouldUseFrontCam(useFrontCam)
hvfrcamera.resumeFR()
To trigger on-demand capture of image and start Face Recognition/Registration on the captured frame, following method can be called:
Objective C:
[hvfrcamera capture:onCaptureHandler];
Swift:
hvfrcamera.capture(onCaptureHandler)
Here, onCaputureHandler
is a closure of type (_ error:NSError?, _ isSuccess:Bool) -> Void
in Swift and ^(NSError * _Nullable, BOOL)
in Objective C
If the capture is successful, isSuccess
is set to true
and error
is set to nil
. Otherwise, isSuccess
is false
and error
is an NSError
object with the following information.
code
: Error code stating type of error. (discussed later)userInfo
: A dictionary of type[String:Any]
.It has only one key,NSLocalizedDescriptionKey
which has the error description.
Please note:
- For registration/face add mode, no auto-capture will happen and this method should be explicitly called.
Once the required images have been captured, to start the transaction of Face Enrolling or Adding, following method should be called:
Objective C:
[hvfrcamera submit];
Swift:
hvfrcamera.submit()
Please note:
- this method can be called only for registration/face add mode
- after this method is complete, the completionHandler passed in
startCamera
is called with the results/error of the User Enroll or Face Add operation.
The following method can be called to clear the images that have been captured via hvfrcamera.capture(onCaptureHandler)
method:
Objective C:
[hvfrcamera clearCapturedImages];
Swift:
hvfrcamera.clearCapturedImages()
Please note:
- This method will clear the reference of the images and delete the images from the disk as well.
- This method will clear only images that are yet to be submitted (or when a submission has failed).
- This method will work with only REGISTRATION and FACE_ADD Modes.
- This method will return an integer value which can be used to determine if the images were successfully cleared. Following are the values that can be returned:
HVFrCamera.SUCCESS_CLEAR_CAPTURED_IMAGES
: This means that the images were cleared successfullyHVFrCamera.ERROR_CLEAR_CAPTURED_IMAGES_INVALID_MODE
: This means that this method is called for an invalid mode. As mentioned above, this method only works for REGISTRATION and FACE_ADD mode.HVFrCamera.ERROR_CLEAR_CAPTURED_IMAGES_CAMERA_NOT_FREE
: This means that an image capture is in progress. Hence the images cannot be cleared now. When this error occurs, please retry after some time.HVFrCamera.ERROR_CLEAR_CAPTURED_IMAGES_PROCESSING_STARTED
: This means that an image upload is already in progress and hence the images cannot be cleared now. Please retry once the processing is done and the completion handler is called with an appropriate result.
-
Add the following to the
viewWillDisappear
method of the ViewController (or anywhere apporpriate) to stop the camera and face recognition.Objective C:
[hvfrcamera stopCamera];
Swift:
hvfrcamera.stopCamera()
Description of the Error Codes in the error
parameter of the completionHandler
in startCamera
method:
Error Code | Description | Explanation | Action |
---|---|---|---|
1 | Initialization Error | Occurs when SDK has not been initialized properly. | Check if the initialization of SDK is happening before any functionality is being used. |
2 | Input Error | Occurs when input provided to the specific flow(Recognition, Registration, Verification etc) is not correct. | Check if all the parameters provided are proper and as per the documentation |
3 | Network Error | Occurs when the internet is either non-existant or very patchy. | Check internet and try again. If Internet is proper, contact HyperVerge |
4 | Timeout Error | Occurs when the timeout(provided by user) is hit and the operation has not yet completed. | Try again |
5 | Authentication Error | Occurs when the request to server could not be Authenticated/Authorized. Happens when the tenantId, tenantKey and adminToken while initializing SDK are not correct. | Make sure tenantId, tenantKey and adminToken are correct |
6 | Internal Server Error | Occurs when there is an internal error at the server. | Notify HyperVerge |
7 | Request Error | Occurs when the request to server is missing some parameters. | Confirm if all the parameters are passed to the method properly |
8 | Internal SDK Error | Occurs when an unexpected error has happened with the HyperSecure SDK. | Notify HyperVerge |
9 | Face Recognition Error | Occurs when there is an error with the Face Recognition. This mosly happens when a Face Recognition/Verification flow is run on a person not already enrolled, face detected by the device is not very clear, unknown person is trying the recognition/verification. | Try again after ensuring that the person is already enrolled and the lightening is also proper. |
10 | Hardware Error | Occurs when there is an error setting up the camera. | Make sure the camera is accessible and only one instance of HVFrCamera is running. |
11 | Camera Permission Denied | Occurs when the user has denied permission to access camera. | In the settings app, give permission to access camera and try again. |
Description of the Error Codes in onCaptureCallback
callback method of the capture
method is given below:
Error Code | Description | Explanation | Action |
---|---|---|---|
1 | Initialization Error | Occurs when SDK has not been initialized properly. | Check if the initialization of SDK is happening before any functionality is being used. |
2 | Input Error | Occurs when input provided to the specific flow(Recognition, Registration, Verification etc) is not correct. | Check if all the parameters provided are proper and as per the documentation |
3 | Camera Not Free Error | Occurs when the capture method is called even before the last capture is not complete. This error can be avoided by waiting for onCaptureCallback call before calling capture again |
Try again |
4 | Face Detection Error | Occurs when the captured frame doesnot have any face in it. | Make sure the face is present in the frame. Also, the movement of camera and the face should be kept minimal while capturing. Also ensure that lightening is proper |
5 | Maximum Image Clicked Error | Occurs when the capture method is called after the number of valid captured images reach a threshold of 5 . |
No more images can be clicked. Captured images should be submitted using submit method |
-
HVFrCamera view is equipped with a default alert view that is shown when a captured image is being processed. If this is to be overriden with your own design, please implement the
HVFrCameraDelegate
. Following are the steps required:-
Confirm your
ViewController
class to theHVFrCameraDelegate
protocol:Objective C (ViewController.m file):
@interface ViewController : UIViewController<HVFrCameraDelegate>
Swift:
class ViewController: UIViewController,HVFrCameraDelegate {
-
Set the ViewController as hvfrcamera's delegate in
viewDidLoad
:Objective C, Swift:
hvfrcamera.delegate = self
-
Implement the methods of
HVFrCameraDelegate
:Objective C:
-(void)willStartProcessing:(HVFrCamera*)hvfrcamera {} -(void)didEndProcessing:(HVFrCamera*)hvfrcamera {}
Swift:
func willStartProcessing(_ hvfrcamera: HVFrCamera) {} func didEndProcessing(_ hvfrcamera: HVFrCamera) {}
Please note:
didEndProcessing
will be called both when the image processing is completed(successfully or otherwise) and whenpauseFr
is somehow reached while processing is in progress.- Implementing the delegate is completely optional.
-
-
Managing Users, Groups and UserData
Management of Users, Groups and UserData requires the ability to perform operations such as creating/deleting a Group, adding/removing a User from a Group, adding/removing a face registered to a User, etc. A complete list of such operations is given in the table below.
End Point Request Result /user/edit {
"userId" : String,
"details" : String
}{
}/user/get {
"userId" : String
}{
"userId" : String,
"roles" : [roles],
"createdDate" : Int,
"details" : String,
"groups" : [{
"groupId" : String,
"role" : String
}],
"faces" : [faceId]
}/user/remove {
"userId" : String
}{
}/user/removeFace {
"userId" : String,
"faceId" : String
}{
}/user/fetchFaces {
"userId" : String
}{
"faces": [String]
}/user/fetchFaceUrls {
"userId" : String
}{
"faceUrls": [String]
}/user/auth {
"userId" : String,
"otp" : String,
"permanent" : true/false /*Default false*/
}{
"token" : string
}/user/getOTP {
"userId" : String
}{
"otp": String
}/group/create {
"groupname" : String,
"sizeLimit" : number
}{
"groupId" : String
}/group/get {
"groupId" : String
}{
"groupname" : String,
"sizeLimit" : String,
"createdDate" : Int
}/group/edit {
"groupId" : String,
"params" : {
"groupname" : String,
"sizeLimit" : Int
}
}{
}/group/remove {
"groupId" : String
}{
}/group/addUser {
"groupId" : String,
"userId" : String
}{
}/group/removeUser {
"groupId" : String,
"userId" : String
}{
}/group/userRole {
"groupId" : String,
"userId" : String,
"groupRole" : groupRole,/* "user" or "groupAdmin" */
}{
}/group/listUsers {
"groupId" : String
}{
"users":[{
"userId" : String,
"details" : String,
"createdTime" : Int ,
faces : [faceId]
}]
}
- Any of the operations mentioned in the table above can be performed using the following method:Objective C:
NSInteger requestId = [HVOperationManager makeRequestWithEndPoint:endpoint request:requestParameters completionHandler:completionHandler]
Swift:
let requestId = HVOperationManager.makeRequest(endpoint:endpoint, request:requestParameters, completionHandler:completionHandler)
The completionHandler is similar to the one from the
startCamera
method. i.e, it is of typeerror:NSError?, result:[String:AnyObject]?) -> Void
in Swift and^(NSError * _Nullable, NSDictionary<NSString *,id> * _Nullable)
in Objective C.The result object has been decribed in the previous table. The error codes are in the next secion.
-
Process captured images
To perform an operation that requires one or more locally present images to be uploaded to the server, one of the following operation can be used. These operations can enable the developer to enroll a user using one or more face images, add one or more face images to a user, perform face based authentication using a face image, perform 1:1 recognition or 1:N recognition using an image saved in the device.
End Point Request imageUri dictionary Result /user/faceauth {
"userId" : String
}{
"image" : String(local path of image)
}{
"token" : String
}/user/enroll {
"userId" : String,
"groupId" : String,
"details" : String
}{
"image1" : String(local path of image)
,
"image2" : String(local path of image)
, ...
}{
"faceIds" : [
{
"label": "image1",
"faceId": String
},
...
],
"faceId" : String
}/user/addFace {
"userId" : String
}{
"image1" : String(local path of image)
,
"image2" : String(local path of image)
, ...
}{
"faceIds" : [
{
"label": "image1",
"faceId": String
},
...
],
"faceId" : String
}/image/verify {
"userId" : String
}{
"image" : String(local path of image)
}{
"faceId" : String,
"personId" : String,
"userDetails" : {
"details" : String,
"userId": String
},
"exists" : Boolean,
"conf" : Integer
}/image/recognize {
"groupId" : String
}{
"image" : String(local path of image)
}{
"faceId" : String,
"personId" : String,
"userDetails" : {
"details" : String,
"userId": String
},
"exists" : Boolean,
"conf" : Integer
}
-
The above operations can also be performed in a way similiar to that mentioned in the last section
Objective C:
NSInteger requestId = [HVOperationManager makeRequestWithEndPoint:endpoint images:imagesUri request:requestParameters completionHandler:completionHandler]
Swift:
let requestId = HVOperationManager.makeRequest( endpoint:endpoint, images:imagesUri, request:requestParameters, completionHandler:completionHandler)
Here,
endpoint
is a String and has been described in the table aboveimagesUri
is an array of Strings, representing the local image path.requestParameters
is a Dictionary and is represented by theRequest
column in the table abovecompletionHandler
is same as thecompletionHandler
mentioned in themakeRequest
method mentioned above
To
cancel
an operation started using HVOperationManager'smakeRequest
method, following method can be used.Objective C:
Boolean isCancelled = [HVOperationManager cancelRequest:requestId];
Swift:
let isCancelled = HVOperationManager.cancelRequest(requestId)
where
requestId
was returned by the correspondingmakeRequest
method that is needed to be cancelled.Description of the Error Codes returned from the completionHandler mentioned above has been given below:
Error Code Description Explanation Action 1 Initialization Error Occurs when SDK has not been initialized properly. Check if the initialization of SDK is happening before any functionality is being used. 2 Network Error Occurs when the internet is either non-existant or very patchy. Check internet and try again. If Internet is proper, contact HyperVerge 3 Authentication Error Occurs when the request to server could not be Authenticated/Authorized. Happens when the tenantId, tenantKey and adminToken while initializing SDK are not correct. Make sure tenantId, tenantKey and adminToken are correct 4 Internal Server Error Occurs when there is an internal error at the server. Notify HyperVerge 5 Internal SDK Error Occurs when an unexpected error has happened with the HyperSecure SDK. Notify HyperVerge 603 INPUT_MISSING_USER_ID Occurs when the request dictionary is missing userId
Provide userId
in the request dictionary and retry604 INPUT_MISSING_USER_DETAILS Occurs when the request dictionary is missing details
Provide details
in the request dictionary and retry605 INPUT_MISSING_GROUPS Occurs when the request dictionary is missing groups
Provide groups
in the request dictionary and retry606 INPUT_MISSING_GROUP_ID Occurs when the request dictionary is missing groupId
Provide groupId
in the request dictionary and retry607 INPUT_MISSING_GROUP_NAME Occurs when the request dictionary is missing groupName
Provide groupName
in the request dictionary and retry608 INPUT_MISSING_GROUP_ROLE Occurs when the request dictionary is missing groupRole
Provide groupRole
in the request dictionary and retry609 INPUT_MISSING_GROUP_SIZE_LIMIT Occurs when the request dictionary is missing sizeLimit
Provide sizeLimit
in the request dictionary and retry610 INPUT_MISSING_IMAGE Occurs when the request dictionary is missing image
Provide image
in the request dictionary and retry611 INPUT_MISSING_ROLE Occurs when the request dictionary is missing role
Provide role
in the request dictionary and retry612 INPUT_MISSING_FACE Occurs when the request dictionary is missing face
Provide face
in the request dictionary and retry613 INPUT_MISSING_FACE_ID Occurs when the request dictionary is missing faceId
Provide faceId
in the request dictionary and retry614 INPUT_MISSING_FACE_IDS Occurs when the request dictionary is missing faceIds
Provide faceIds
in the request dictionary and retry615 INPUT_USER_NOT_FOUND Occurs when there is no user associated with the userId
providedProvide correct userId
and retry616 INPUT_USER_ALREADY_EXIST Occurs when a user with userId
provided already existsProvide a new unique userId
and retry617 INPUT_GROUP_NOT_FOUND Occurs when no group is associated with the groupId
providedProvide correct groupId
and retry618 INPUT_GROUP_ALREADY_EXIST Occurs when a group already exists with the groupId
providedProvide a new unique groupId
and retry621 INPUT_OTP_MISMATCH Occurs when the OTP provided doesnot match the one that is sent to the user Provide correct otp
and retry622 ERROR_INPUT_INVALID_ENDPOINT Occurs when the endPoint
provided is not validProvide correct the endPoint
and retry623 INPUT_INVALID_IMAGE_PATH Occurs when the imageUri
dictionary is null or there are invalid entries inimageUri
Validate the uris in imageUri
and the image path passed in it and retry624 ERROR_INPUT_ILLEGAL_PARAMETER Occurs when one or more illegal keys are provided in the request
dictionaryRemove the illegal key value pair from request
and retry699 INPUT_OTHER Occurs when there is someother issue with the input Read the log message for a detailed explanation -