Simulate Application Review
Overview
Do not enter production data in the Test environment. The Highnote Test environment is for exploring features and training. Use only dummy or test data.
Highnote's application review simulation lets you test the following:
- The status of an application
- Your application review workflow
- Document uploads
Prerequisites
- A Highnote account
- Access to the Highnote API, API Explorer, or dashboard
- A card product
Simulate application review workflow
To simulate an application review workflow, we recommend using the following sequence:
Create an account holder with an open application:
- Create an account holder with specific KYC/KYB values.
- Open an application to simulate an
IN_REVIEWorDENIEDstatus.
Simulate a document upload:
- Simulate a document upload session.
- Update the status of the document.
- Update the identity verification status of the account holder.
- Optionally Simulate additional document upload sessions, e.g., if identity re-verification fails.
- Update the application status to approve or deny.
Create account holder with simulated values
To simulate an application with the status of IN_REVIEW or DENIED, you must create an account holder with specific simulated values (provided below).
These values differ depending on whether the applicant is undergoing Know-Your-Customer (KYC) or Know-Your-Business (KYB) verification:
- KYC: Verification for person applications
- KYB: Verification for business applications
Person (KYC) verification values
KYC verification is used to verify the identity of the following types of applicants:
USPersonAccountHolderUSBusinessAuthorizedPersonUSBusinessUltimateBeneficialOwner
Use the following values when creating an account holder to simulate the following application statuses:
| Application Status | Account Holder Detail | Simulation Value |
|---|---|---|
DENIED | givenName | FORCE-DECLINE |
IN_REVIEW | streetAddress | 123 Manual Review St. |
For DENIED applications, you can use additional values to produce failure tags and simulate different failure scenarios:
| Failure Tag | Account Holder Detail | Simulation Value | Pass Tag |
|---|---|---|---|
DOB_MISMATCH | dateOfBirth | 2000-01-01 | DOB_MATCH |
ADDRESS_MISMATCH | postalCode | 66666 or 11111 | ADDRESS_MATCH |
PHONE_MISMATCH | phoneNumber | 6666666666 | PHONE_MATCH |
SSN_MISMATCH; Requires one document to verify identity | socialSecurityNumber | 666-66-6666, 111-11-1111, or 111-11-1211 | SSN_MATCH |
SSN_MULTI_IDENTITY; Requires two documents to verify identity | socialSecurityNumber | 111-11-1131 | N/A |
WATCHLIST_HIT | givenName and familyName | IN-REVIEW | NAME_MATCH |
ADDRESS_WARNING | streetAddress | 123 Warning St. | N/A |
After creating an account holder with simulated values, open an application.
Business (KYB) verification values
KYB verification is used to verify the identity and details of a USBusinessAccountHolder.
KYC verification is also required for each USBusinessAuthorizedPerson or USBusinessUltimateBeneficialOwner under a USBusinessAccountHolder.
Use the following values when creating an account holder to simulate the following application statuses:
| Application Status | Account Holder Detail | Simulation Value |
|---|---|---|
DENIED | legalBusinessName | FORCE_DECLINE |
IN_REVIEW | streetAddress | 123 Manual Review St. |
For DENIED applications, you can use additional values to produce failure tags and simulate different failure scenarios:
| Failure Tag | Account Holder Detail | Simulation Value | Pass Tag |
|---|---|---|---|
ADDRESS_MISMATCH | businessProfile.billingAddress.postalCode | 66666 or 11111 | ADDRESS_MATCH |
FEIN_MISMATCH | employerIdentificationNumber | 666-66-6666, 111-11-1111, or 111-11-1211 | FEIN_MATCH |
REPRESENTATIVE_MISMATCH | primaryAuthorizedPerson.givenName | MISMATCH | REPRESENTATIVE_MATCH |
WATCHLIST_HIT | primaryAuthorizedPerson.givenName and primaryAuthorizedPerson.familyName | IN-REVIEW | NAME_MATCH |
BUSINESS_VERIFICATION_SCORE_FAILED | N/A | Simulate three or more failure tags from this table | BUSINESS_VERIFICATION_SCORE_PASSED |
ADDRESS_WARNING | streetAddress | 123 Warning St. | N/A |
After creating an account holder with simulated values, open an application.
Simulate document upload session
Once an application has entered IN_REVIEW status, you can begin a document upload session to simulate adding supporting documents.
Use the following steps to simulate the document upload session:
- Optional Generate a client token.
- Start document upload session.
- Create document upload link.
- End the document upload session.
Update document upload status
Once you've closed the document upload session, you can simulate the review status of each document by assigning a new status of APPROVED or DENIED.
Use the following mutation to simulate the review status for each document uploaded in the upload session:
SimulateApplicationDocumentReview
Query
mutation simulateApplicationDocumentReview(
$input: SimulateApplicationDocumentReviewInput!
) {
simulateApplicationDocumentReview(input: $input) {
__typename
... on AccountHolderApplicationDocument {
createdAt
status
type
updatedAt
revisions {
createdAt
status
type
updatedAt
}
}
... on UserError {
errors {
code
errorPath
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "applicationId": "APPLICATION_ID", "documentUploadLinkId": "DOCUMENT_UPLOAD_SESSION_LINK_ID", "documentUploadSessionId": "DOCUMENT_UPLOAD_SESSION_ID", "newReviewStatus": "APPROVED" } }
Result
{
"data": {
"simulateApplicationDocumentReview": {
"__typename": "AccountHolderApplicationDocument",
"createdAt": "2022-10-13T21:20:38.463Z",
"status": "APPROVED",
"type": "DRIVERS_LICENSE",
"updatedAt": "2022-10-13T21:20:45.587Z",
"revisions": [
{
"createdAt": "2022-10-13T21:20:38.463Z",
"status": null,
"type": "DRIVERS_LICENSE",
"updatedAt": "2022-10-13T21:20:38.510Z"
}
]
}
}
}
Update identity verification status
- In the Test environment, you can approve an application with the identity verification status set to any value:
PASSED,PENDING,DENIED. - In the Live environment, the identity verification status of each account holder must be set to
PASSEDbefore you can approve an application. :::
Once a document review status is assigned, you can simulate the identity verification status of an account holder, represented by the currentVerification field.
For business account holders that have multiple authorized persons or owners, all account holder identities must pass for an application to be approved.
Use the following mutation to simulate an identity verification status change, and update newVerificationStatus from IN_REVIEW to PASSED or DENIED:
SimulateApplicationVerificationStatusChange
Query
mutation simulateApplicationVerificationStatusChange(
$input: SimulateApplicationVerificationStatusChangeInput!
) {
simulateApplicationVerificationStatusChange(input: $input) {
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
cardProduct {
id
}
accountHolderSnapshot {
... on USPersonAccountHolderSnapshot {
accountHolderCurrent {
id
name {
givenName
familyName
}
}
currentVerification {
reason
status
results {
code
}
requiredDocuments {
referenceIdentifier
documentUploadSession {
... on USAccountHolderApplicationDocumentUploadSession {
id
status
createdAt
updatedAt
documents {
id
uploadUrl
createdAt
updatedAt
}
}
}
uploadedDocuments {
... on AccountHolderApplicationDocument {
createdAt
status
type
updatedAt
}
}
}
}
}
}
}
}
}
Variables
{ "input": { "applicantId": "ACCOUNT_HOLDER_ID", "applicationId": "APPLICATION_ID", "newVerificationStatus": "PASSED" } }
Result
{
"data": {
"simulateApplicationVerificationStatusChange": {
"id": "APPLICATION_ID",
"applicationState": {
"status": "IN_REVIEW"
},
"cardProduct": {
"id": "CARD_PRODUCT_ID"
},
"accountHolderSnapshot": {
"accountHolderCurrent": {
"id": "ACCOUNT_HOLDER_ID",
"name": {
"givenName": "IN-REVIEW"
}
},
"name": {
"givenName": "IN-REVIEW",
"familyName": "lastName"
},
"currentVerification": {
"reason": "PASSED",
"status": "PASSED",
"results": [
{
"code": "NAME_MISMATCH"
},
{
"code": "ADDRESS_MATCH"
},
{
"code": "DOB_MATCH"
}
],
"requiredDocuments": [
{
"status": "SUBMITTED",
"documentUploadSession": {
"id": "DOCUMENT_UPLOAD_SESSION_ID",
"status": "SUBMITTED"
},
"uploadedDocuments": [
{
"createdAt": "2022-10-13T21:20:38.463Z",
"status": "APPROVED",
"type": "DRIVERS_LICENSE",
"updatedAt": "2022-10-13T21:20:45.587Z"
}
]
}
]
}
}
}
}
}
Simulate additional document upload sessions
If you are only simulating one document upload session, skip this simulation.
The following scenarios may require additional document upload sessions:
- The document provided by the account holder is insufficient to approve the application.
- You need to add primary authorized persons or beneficial owners to a business account holder.
- An application has multiple applicants, each of which requires multiple document types.
When simulating additional document upload sessions:
- The application status remains
IN_REVIEW, - The
currentVerification.statusfor each unverified application remainsPENDING. - The
currentVerification.reasonfor each requested application updates toDOCUMENT_UPLOAD_REQUESTED.
Use the following mutation to simulate additional document upload sessions. Provide a specific documentType for each applicantId. See document types.
SimulateCreateApplicationDocumentsUploadSessions
Query
mutation simulateCreateApplicationDocumentsUploadSessions(
$input: SimulateCreateApplicationDocumentsUploadSessionsInput!
) {
simulateCreateApplicationDocumentsUploadSessions(input: $input) {
__typename
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
cardProduct {
id
}
accountHolderSnapshot {
__typename
... on USPersonAccountHolderSnapshot {
accountHolderCurrent {
id
name {
givenName
}
}
currentVerification {
reason
status
results {
code
}
}
}
}
updatedAt
createdAt
}
... on UserError {
errors {
code
errorPath
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "applicationId": "APPLICATION_ID", "memo": "Additional documents are requested", "requestedDocuments": [ { "applicantId": "ACCOUNT_HOLDER_ID", "documentType": [ "PASSPORT" ] }, { "applicantId": "ACCOUNT_HOLDER_ID", "documentType": [ "DRIVERS_LICENSE", "STATE_ISSUED_ID" ] } ] } }
Result
{
"data": {
"node": {
"id": "APPLICATION_ID",
"applicationState": {
"status": "IN_REVIEW"
},
"cardProduct": {
"id": "CARD_PRODUCT_ID"
},
"accountHolderSnapshot": {
"accountHolderCurrent": {
"id": "ACCOUNT_HOLDER_ID",
"name": {
"givenName": "IN-REVIEW"
}
},
"name": {
"givenName": "IN-REVIEW",
"familyName": "DECLINE"
},
"currentVerification": {
"reason": "DOCUMENT_UPLOAD_REQUIRED",
"status": "PENDING",
"requiredDocuments": [
{
"status": "CREATED",
"documentUploadSession": {
"id": "DOCUMENT_UPLOAD_SESSION_ID",
"status": "UPLOADED",
"documents": null
},
"uploadedDocuments": null
},
{
"status": "CREATED",
"documentUploadSession": {
"id": "DOCUMENT_UPLOAD_SESSION_ID",
"status": "CREATED",
"documents": null
},
"uploadedDocuments": null
}
]
}
}
}
}
}
Update application status
This mutation lets you approve or deny an application status, but it does not approve each of the verification components. Verification components must be approved before you can create a financial account. To update verification components, see Update the identity verification status.
To simulate an application status, you can update the application from IN_REVIEW to APPROVED or DENIED.
Use the following mutation to update the application status:
SimulateApplicationStatusChange
Query
mutation simulateApplicationStatusChange(
$input: SimulateApplicationStatusChangeInput!
) {
simulateApplicationStatusChange(input: $input) {
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
cardProduct {
id
}
accountHolderSnapshot {
... on USPersonAccountHolderSnapshot {
accountHolderCurrent {
id
name {
givenName
}
}
name {
givenName
familyName
}
billingAddress {
streetAddress
locality
region
countryCodeAlpha3
postalCode
}
currentVerification {
reason
status
results {
code
}
requiredDocuments {
referenceIdentifier
documentUploadSession {
... on USAccountHolderApplicationDocumentUploadSession {
id
status
createdAt
updatedAt
documents {
id
uploadUrl
createdAt
updatedAt
}
}
}
}
}
}
}
}
... on UserError {
errors {
code
errorPath
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "applicationId": "APPLICATION_ID", "newApplicationStatus": "APPROVED" } }
Result
{
"data": {
"simulateApplicationStatusChange": {
"id": "APPLICATION_ID",
"applicationState": {
"status": "APPROVED"
},
"cardProduct": {
"id": "CARD_PRODUCT_ID"
},
"accountHolderSnapshot": {
"accountHolderCurrent": {
"id": "ACCOUNT_HOLDER_ID",
"name": {
"givenName": "IN-REVIEW",
"familyName": "lastName"
}
},
"currentVerification": {
"reason": "PASSED",
"status": "PASSED",
"results": [
{
"code": "DOB_MATCH"
},
{
"code": "ADDRESS_MATCH"
},
{
"code": "NAME_MISMATCH"
}
],
"requiredDocuments": [
{
"status": "SUBMITTED",
"documentUploadSession": {
"id": "DOCUMENT_UPLOAD_SESSION_ID",
"status": "SUBMITTED"
},
"uploadedDocuments": [
{
"createdAt": "2022-10-13T21:20:38.463Z",
"status": "APPROVED",
"type": "DRIVERS_LICENSE",
"updatedAt": "2022-10-13T21:20:45.587Z"
}
]
}
]
}
}
}
}
}