Skip to main content

Collaborative Application Decisioning

Overview

info

Collaborative application decisioning is self-service in your Test environment. In the Live environment, the feature must be enabled for your card product by the Highnote team.

With collaborative application decisioning, you or your underwriter can make a recommended decision of APPROVED or DENIED for applications of your product based on your credit policy. Highnote will conduct regulatory checks on the application, including KYC, KYB, and OFAC, and use your recommended decision to arrive at a final decision. Highnote also allows for customization of the sequencing of application decisioning calls and rule execution to fit your product and credit policy.

This guide assumes that you or your underwriter provide a recommended decision after identity and fraud checks are run by Highnote.

Enable collaborative application decisioning

In the Live environment, the Highnote team will enable this feature for you. To request access to this feature, contact support@highnote.com.

Use the following mutation to enable collaborative application decisioning in the Test environment:

EnableCollaborativeApplicationUnderwritingFeature
Query
mutation EnableCollaborativeApplicationUnderwritingFeature(
$input: EnableCollaborativeApplicationUnderwritingFeatureInput!
) {
enableCollaborativeApplicationUnderwritingFeature(input: $input) {
__typename
... on CardProduct {
id
features {
__typename
enabled
}
}
... on UserError {
errors {
errorPath
code
description
}
}
}
}
Variables
{
  "input": {
    "cardProductId": "CARD_PRODUCT_ID"
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"enableCollaborativeApplicationUnderwritingFeature": {
"__typename": "CardProduct",
"id": "CARD_PRODUCT_ID",
"features": [
{
"__typename": "CollaborativeApplicationUnderwritingCardProductFeature",
"enabled": true
}
]
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

Receive a decision request

info

You must set up notification targets to receive notification events. For more information, see Notifications.

After an application is submitted to Highnote, you will receive the underwriting decision requested notification event. This notification event requests an underwriting decision from you or your underwriter.

The following payload is an example of the notification event you will receive:

Example notification event payload

{
"data": {
"node": {
"__typename": "NotificationEvent",
"createdAt": "2022-12-12T16:32:49.125Z",
"id": "NOTIFICATION_EVENT_ID",
"name": "CARD_PRODUCT_APPLICATION_UNDERWRITING_DECISION_REQUESTED",
"node": {
"__typename": "AccountHolderCardProductApplication",
"applicationState": {
"status": "PENDING"
},
"createdAt": "2022-12-12T16:32:44.499Z",
"id": "APPLICATION_ID",
"updatedAt": "2022-12-12T16:32:44.499Z"
}
}
},
"extensions": {
"signatureTimestamp": 1670862772620
}
}

After receiving the event notification, Highnote waits for your response to the underwriting decision.

Approve request

To approve a collaborative application decision request, you must respond with the credit limit decision. If you are unsure about the initial credit limit during the underwriting decision, you can assign a credit limit of $0 and adjust it on the financial account later.

Use the following mutation to approve a collaborative application decision request:

approveCreditProductApplicationUnderwriting
Query
mutation approveCreditProductApplicationUnderwriting(
$input: ApproveCreditProductApplicationUnderwritingInput!
) {
approveCreditProductApplicationUnderwriting(input: $input) {
__typename
... on UserError {
errors {
errorPath
code
description
}
}
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
cardProduct {
id
}
accountHolderSnapshot {
... on USBusinessAccountHolderSnapshot {
businessProfile {
name {
legalBusinessName
doingBusinessAsName
}
updatedAt
createdAt
currentVerification {
status
reason
results {
code
}
}
currentCreditUnderwritingVerification {
status
}
}
}
}
updatedAt
createdAt
}
}
}
Variables
{
  "input": {
    "applicationId": "APPLICATION_ID",
    "decisionDate": "2022-10-12T23:53:52.860Z",
    "standardPurchaseCreditLimit": {
      "value": 400000,
      "currencyCode": "USD"
    }
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"approveCreditProductApplicationUnderwriting": {
"__typename": "AccountHolderCardProductApplication",
"id": "APPLICATION_ID",
"applicationState": {
"status": "PENDING"
},
"cardProduct": {
"id": "CARD_PRODUCT_ID"
},
"accountHolderSnapshot": {
"businessProfile": {
"name": {
"legalBusinessName": "HIGHNOTE",
"doingBusinessAsName": "BlueJay Inc"
},
"updatedAt": "2023-01-06T20:24:20.303Z",
"createdAt": "2023-01-06T20:24:13.191Z",
"currentVerification": {
"status": "PASSED",
"reason": "PASSED",
"results": []
},
"currentCreditUnderwritingVerification": {
"status": "PASSED"
}
}
},
"updatedAt": "2023-01-06T20:24:20.303Z",
"createdAt": "2023-01-06T20:24:13.191Z"
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

Deny request

When you deny a decision request, the overall application is DENIED and you must provide applicable adverse action reason(s) based on your credit policy. If a decision is not received within 30 days from the application creation date, the application status will transition to DENIED.

For a complete list of adverse action reasons, see the API Reference.

Use the following mutation to deny a decision request:

denyCreditProductApplicationUnderwriting
Query
mutation denyCreditProductApplicationUnderwriting(
$input: DenyCreditProductApplicationUnderwritingInput!
) {
denyCreditProductApplicationUnderwriting(input: $input) {
__typename
... on UserError {
errors {
errorPath
code
description
}
}
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
cardProduct {
id
}
adverseActionReasons {
code
description
}
accountHolderSnapshot {
... on USBusinessAccountHolderSnapshot {
businessProfile {
name {
legalBusinessName
doingBusinessAsName
}
updatedAt
createdAt
currentVerification {
status
reason
results {
code
}
}
}
}
}
updatedAt
createdAt
}
}
}
Variables
{
  "input": {
    "applicationId": "APPLICATION_ID",
    "decisionDate": "2022-10-12T23:53:52.860Z",
    "adverseActionReasons": [
      {
        "code": "INSUFFICIENT_INCOME"
      }
    ]
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"denyCreditProductApplicationUnderwriting": {
"__typename": "AccountHolderCardProductApplication",
"id": "APPLICATION_ID",
"applicationState": {
"status": "PENDING"
},
"cardProduct": {
"id": "CARD_PRODUCT_ID"
},
"adverseActionReasons": [
{
"code": "INSUFFICIENT_INCOME",
"description": "Income insufficient for the amount of credit requested"
}
],
"accountHolderSnapshot": {
"businessProfile": {
"name": {
"legalBusinessName": "HIGHNOTE",
"doingBusinessAsName": "BlueJay Inc"
},
"updatedAt": "2023-01-06T21:39:03.273Z",
"createdAt": "2023-01-06T21:38:54.572Z",
"currentVerification": {
"status": "PASSED",
"reason": "PASSED",
"results": []
}
}
},
"updatedAt": "2023-01-06T21:39:03.273Z",
"createdAt": "2023-01-06T21:38:54.572Z"
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

Manage offers

info

Please reach out to your Highnote representative to configure your card product for offer management.

If an account holder's creditworthiness does not qualify them for the card product they applied for, you can extend an alternative offer for a different product. For example, you may want to offer a secured credit card instead of an unsecured one. For more information on Highnote's secured deposit feature, see Create Secured Deposit Offer. From the time of the first extended offer, the account holder will have 30 days to accept the offer before the application is systemically denied.

You can disqualify an offer if the account holder does not meet the underwriting criteria. Alternatively, if the account holder does not accept the offer you extended, you can reject the offer. If all offers on the application are disqualified or rejected, the application will be denied.

If your card product is configured for offer management, you should subscribe to CARD_PRODUCT_APPLICATION_OFFER_MANAGEMENT_REQUESTED events to be notified when an application has reached the offer management state and will require an input before the application can be decisioned.

Use the following mutation to extend, disqualify, or reject an offer:

updateAccountHolderCardProductApplicationOffers
Query
mutation updateAccountHolderCardProductApplicationOffers(
$input: UpdateAccountHolderCardProductApplicationOffersInput!
$filterByAccepted: AccountHolderCardProductApplicationOfferFilterByInput
$filterByDisqualified: AccountHolderCardProductApplicationOfferFilterByInput
$filterByExtended: AccountHolderCardProductApplicationOfferFilterByInput
$filterByOpen: AccountHolderCardProductApplicationOfferFilterByInput
$filterByRejected: AccountHolderCardProductApplicationOfferFilterByInput
) {
updateAccountHolderCardProductApplicationOffers(input: $input) {
__typename
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
cardProduct {
id
}
acceptedOffers: offers(first: 10, filterBy: $filterByAccepted) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
disqualifiedOffers: offers(first: 10, filterBy: $filterByDisqualified) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
extendedOffers: offers(first: 10, filterBy: $filterByExtended) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
openOffers: offers(first: 10, filterBy: $filterByOpen) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
rejectedOffers: offers(first: 10, filterBy: $filterByRejected) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
}
}
}
Variables
{
  "input": {
    "applicationId": "ap_1234",
    "offerUpdates": [
      {
        "offerId": "prvio_1234",
        "offerStatus": "REJECTED"
      },
      {
        "offerId": "prvio_5678",
        "offerStatus": "EXTENDED"
      }
    ]
  },
  "filterByAccepted": {
    "offerStatus": {
      "includes": [
        "ACCEPTED"
      ]
    }
  },
  "filterByDisqualified": {
    "offerStatus": {
      "includes": [
        "DISQUALIFIED"
      ]
    }
  },
  "filterByExtended": {
    "offerStatus": {
      "includes": [
        "EXTENDED"
      ]
    }
  },
  "filterByOpen": {
    "offerStatus": {
      "includes": [
        "OPEN"
      ]
    }
  },
  "filterByRejected": {
    "offerStatus": {
      "includes": [
        "REJECTED"
      ]
    }
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"node": {
"__typename": "AccountHolderCardProductApplication",
"id": "ap_1234",
"applicationState": {
"status": "PENDING"
},
"cardProduct": {
"id": "pd_1234"
},
"acceptedOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": ""
},
"edges": []
},
"disqualifiedOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": ""
},
"edges": []
},
"extendedOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fZjNmNzc5ZmRiYzRiNGY4YmJiZGQ0ZDEwNGJhYWZiZTQ"
},
"edges": [
{
"cursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fZjNmNzc5ZmRiYzRiNGY4YmJiZGQ0ZDEwNGJhYWZiZTQ",
"node": {
"id": "prvio_5678",
"name": "offer0",
"status": "EXTENDED",
"category": "SECURED_CREDIT"
}
}
]
},
"openOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fMzM0NTExOTQ2Zjg2NGMzMWFmNzE2NDVlN2NmNmY5ZWY"
},
"edges": [
{
"cursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fMTYwZjdlYjQ4ZWFmNDg4MmFjOWYyYmQ0NDhkM2EzNTc",
"node": {
"id": "prvio_7890",
"name": "offer1",
"status": "OPEN",
"category": "SECURED_CREDIT"
}
}
]
},
"rejectedOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": ""
},
"edges": [
{
"cursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fMzM0NTExOTQ2Zjg2NGMzMWFmNzE2NDVlN2NmNmY5ZWY",
"node": {
"id": "prvio_1234",
"name": "offer3",
"status": "REJECTED",
"category": "UNSECURED_CREDIT"
}
}
]
}
}
}
}

Accept offer

info

An offer must be EXTENDED before it can be ACCEPTED. The primary offer will automatically be EXTENDED if underwriting is approved on the application.

If your card product has offers, one offer must be accepted to approve the application by providing the account holder’s consent and the accepted offerID, including the primary offer the account holder applied for.

Once an account holder accepts an offer, the application will be approved and a financial account can be issued for their accepted card product.

Use the following mutation to accept an offer:

acceptAccountHolderCardProductApplicationOffer
Query
mutation acceptAccountHolderCardProductApplicationOffer(
$input: AcceptAccountHolderCardProductApplicationOfferInput!
$filterByAccepted: AccountHolderCardProductApplicationOfferFilterByInput
$filterByOpen: AccountHolderCardProductApplicationOfferFilterByInput
$filterByDisqualified: AccountHolderCardProductApplicationOfferFilterByInput
$filterByExtended: AccountHolderCardProductApplicationOfferFilterByInput
$filterByRejected: AccountHolderCardProductApplicationOfferFilterByInput
) {
acceptAccountHolderCardProductApplicationOffer(input: $input) {
__typename
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
cardProduct {
id
}
acceptedOffers: offers(first: 10, filterBy: $filterByAccepted) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
disqualifiedOffers: offers(first: 10, filterBy: $filterByDisqualified) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
extendedOffers: offers(first: 10, filterBy: $filterByExtended) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
openOffers: offers(first: 10, filterBy: $filterByOpen) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
rejectedOffers: offers(first: 10, filterBy: $filterByRejected) {
pageInfo {
hasNextPage
startCursor
}
edges {
cursor
node {
id
name
status
category
}
}
}
}
}
}
Variables
{
  "input": {
    "applicationId": "ap_1234",
    "offerId": "prvio_5678",
    "consentAgreement": {
      "primaryAuthorizedPersonId": "ps_ap1234",
      "consentTimestamp": "2024-12-22T17:10:55.662Z",
      "ipAddress": {
        "v6": "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
      }
    }
  },
  "filterByAccepted": {
    "offerStatus": {
      "includes": [
        "ACCEPTED"
      ]
    }
  },
  "filterByDisqualified": {
    "offerStatus": {
      "includes": [
        "DISQUALIFIED"
      ]
    }
  },
  "filterByExtended": {
    "offerStatus": {
      "includes": [
        "EXTENDED"
      ]
    }
  },
  "filterByOpen": {
    "offerStatus": {
      "includes": [
        "OPEN"
      ]
    }
  },
  "filterByRejected": {
    "offerStatus": {
      "includes": [
        "REJECTED"
      ]
    }
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"node": {
"__typename": "AccountHolderCardProductApplication",
"id": "ap_1234",
"applicationState": {
"status": "APPROVED"
},
"cardProduct": {
"id": "pd_1234"
},
"acceptedOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": ""
},
"edges": [
{
"cursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fZjNmNzc5ZmRiYzRiNGY4YmJiZGQ0ZDEwNGJhYWZiZTQ",
"node": {
"id": "prvio_5678",
"name": "offer0",
"status": "ACCEPTED",
"category": "SECURED_CREDIT"
}
}
]
},
"disqualifiedOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": ""
},
"edges": []
},
"extendedOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fZjNmNzc5ZmRiYzRiNGY4YmJiZGQ0ZDEwNGJhYWZiZTQ"
},
"edges": []
},
"openOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fMzM0NTExOTQ2Zjg2NGMzMWFmNzE2NDVlN2NmNmY5ZWY"
},
"edges": [
{
"cursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fMTYwZjdlYjQ4ZWFmNDg4MmFjOWYyYmQ0NDhkM2EzNTc",
"node": {
"id": "prvio_7890",
"name": "offer1",
"status": "OPEN",
"category": "SECURED_CREDIT"
}
}
]
},
"rejectedOffers": {
"pageInfo": {
"hasNextPage": false,
"startCursor": ""
},
"edges": [
{
"cursor": "dD0yMDI0LTEwLTA5VDE5JTNBMjMlM0E0Ny42NjMwMDAwMDBaJmk9cHJ2aW9fMzM0NTExOTQ2Zjg2NGMzMWFmNzE2NDVlN2NmNmY5ZWY",
"node": {
"id": "prvio_1234",
"name": "offer3",
"status": "REJECTED",
"category": "UNSECURED_CREDIT"
}
}
]
}
}
}
}

Check application status

After an application decision is made, the application will be marked as PENDING while Highnote makes a final decision. To keep track of application status updates, you can use the GetAccountHolderCardProductApplication query or subscribe to the application status events notification to get notified when the application’s status changes.

Use the following query to check the status of an application:

GetAccountHolderCardProductApplication
Query
query GetAccountHolderCardProductApplication($id: ID!) {
node(id: $id) {
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
cardProduct {
id
}
adverseActionReasons {
code
description
}
accountHolderSnapshot {
... on USBusinessAccountHolderSnapshot {
accountHolderCurrent {
id
}
primaryAuthorizedPerson {
currentVerification {
status
reason
results {
code
}
}
updatedAt
createdAt
}
businessProfile {
name {
legalBusinessName
doingBusinessAsName
}
updatedAt
createdAt
currentVerification {
adverseActionReasons {
code
description
}
status
reason
results {
code
}
}
currentCreditUnderwritingVerification {
status
decision {
... on UnderwriterPositiveDecision {
creditLine {
value
currencyCode
}
}
... on UnderwriterAdverseDecision {
adverseActionReasons {
code
description
}
}
}
}
ultimateBeneficialOwners {
currentVerification {
status
reason
results {
code
}
}
updatedAt
createdAt
}
}
}
}
applicationHistory {
pageInfo {
startCursor
endCursor
hasNextPage
hasPreviousPage
}
edges {
cursor
node {
applicationState {
status
}
}
}
}
updatedAt
createdAt
}
}
}
Variables
{
"id": "APPLICATION_ID"
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"node": {
"id": "APPLICATION_ID",
"applicationState": {
"status": "DENIED"
},
"cardProduct": {
"id": "CARD_PRODUCT_ID"
},
"adverseActionReasons": [
{
"code": "INSUFFICIENT_INCOME",
"description": "Income insufficient for the amount of credit requested"
}
],
"accountHolderSnapshot": {
"accountHolderCurrent": {
"id": "APPLICATION_SNAPSHOT_ID"
},
"primaryAuthorizedPerson": {
"currentVerification": {
"status": "PASSED",
"reason": "PASSED",
"results": [
{
"code": "PHONE_MATCH"
},
{
"code": "SSN_MATCH"
},
{
"code": "NAME_MATCH"
},
{
"code": "DOB_MATCH"
},
{
"code": "ADDRESS_MATCH"
}
]
},
"updatedAt": "2023-01-06T18:46:25.061Z",
"createdAt": "2023-01-06T18:46:22.738Z"
},
"businessProfile": {
"name": {
"legalBusinessName": "HIGHNOTE",
"doingBusinessAsName": "BlueJay Inc"
},
"updatedAt": "2023-01-06T18:46:59.510Z",
"createdAt": "2023-01-06T18:46:22.737Z",
"currentVerification": {
"adverseActionReasons": [],
"status": "PASSED",
"reason": "PASSED",
"results": [
{
"code": "REPRESENTATIVE_MATCH"
},
{
"code": "FEIN_MATCH"
},
{
"code": "BUSINESS_VERIFICATION_SCORE_PASSED"
},
{
"code": "ADDRESS_MATCH"
},
{
"code": "BUSINESS_NAME_MATCH"
}
]
},
"currentCreditUnderwritingVerification": {
"status": "DENIED",
"decision": {
"adverseActionReasons": [
{
"code": "INSUFFICIENT_INCOME",
"description": "Income insufficient for the amount of credit requested"
}
]
}
},
"ultimateBeneficialOwners": [
{
"currentVerification": {
"status": "PASSED",
"reason": "PASSED",
"results": [
{
"code": "PHONE_MATCH"
},
{
"code": "SSN_MATCH"
},
{
"code": "NAME_MATCH"
},
{
"code": "DOB_MATCH"
},
{
"code": "ADDRESS_MATCH"
}
]
},
"updatedAt": "2023-01-06T18:46:25.061Z",
"createdAt": "2023-01-06T18:46:22.738Z"
}
]
}
},
"applicationHistory": {
"pageInfo": {
"startCursor": "start-cursor",
"endCursor": "end-cursor",
"hasNextPage": false,
"hasPreviousPage": false
},
"edges": [
{
"cursor": "some-cursor",
"node": {
"applicationState": {
"status": "PENDING"
}
}
},
{
"cursor": "some-cursor",
"node": {
"applicationState": {
"status": "PENDING"
}
}
},
{
"cursor": "some-cursor",
"node": {
"applicationState": {
"status": "PENDING"
}
}
}
]
},
"updatedAt": "2023-01-06T18:46:59.510Z",
"createdAt": "2023-01-06T18:46:22.737Z"
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}