1. Introduction
Welcome to the Chirp Developer Guide!
In this document, you will find all the resources you need to learn about, quickly integrate with, and get started using Chirp.
Chirp solutions provide you with features and data you need to build an Instant Financial Verification process and associated workflows for your unique underwriting process. Chirp makes it easy for you to connect to your customers' financial accounts to collect, analyze, and make more informed decisions based on transactional data.
1.1. About Chirp
Chirp is a web-based service with a full set of APIs that provides Instant Financial Verification Data for lenders to mitigate their risk using financial activity of their end customers.
Chirp IFV has real-time access to over 10,000 financial institutions. Chirp enables your business to verify your customers financial information quickly, securely and easily by providing the ability to see real-time financial transactions. Transaction data for a customer is capped at 180 days and 1,500 transactions.
Lenders will be able to create and manage Instant Financial Verification right from their Chirp portal account or from their Loan Management System through Chirp’s API.
2. Working with Chirp APIs
To access the Chirp APIs, you will need an account with Chirp with at least one approved Entity, Profile and User. If you have an active account, you can login to the Chirp Portal to retrieve Sandbox and Production API keys. Please refer here to know more about Chirp’s API tokens.
2.1. Using Chirp Sandbox APIs for Development and Testing
The Chirp Sandbox environment allows you to use the “Sandbox API token” for development and testing. The Sandbox environment limits developers to 5 financial institutions and with a total of 30 users. When production access is enabled all sandbox users are automatically removed by the system.
There are two options to consider when connecting to Sandbox:
- Using the “Chirp Test Bank” financial institution which is preloaded with test users and test data.
- This option allows for testing with sample data and scenarios without creating users and connection to a live bank.
- There are a few supported financial institutions in the Chirp Sandbox environment.
- This option allows for further testing with live financial account data. This option requires a person, with an active online financial institution profile, to participate in the Instant Financial Verification process.
- These financial institutions can be used for testing using real bank credentials in the Sandbox environment.
Note: A request created with a Sandbox token is accessible only in Sandbox environment.
2.1.1. Test credentials for using the “Chirp Test Bank”
This allows for quick testing of different scenarios without creating real financial institution requests. These Test Credentials can only be used when the requests are created in the Sandbox environment using the “Chirp Test Bank”.
Username | Password | Description |
---|---|---|
test_chirp | password | Verification without MFA challenges |
test_chirp | challenge | Load Multi-Factor Authentication (MFA) challenges. Anwering with the word 'correct' will get through the MFA successfully |
test_chirp | image | Load image challenge for MFA. Anwering with the word 'correct' will get through the MFA successfully |
test_chirp | options | Load other available MFA challenges for verification |
test_chirp | UNAUTHORIZED | For simulating the verification process with invalid credentials |
test_chirp | SERVER_ERROR | For simulating financial institution with a server error |
If you want to work with one of the 5 financial institutions available in the Sandbox environment, the actual user credentials associated with the selected financial institution account must be used. For instance, if you are selecting USAA Bank, the real credentials for a USAA Bank account must be used.
2.2. Switching to Production
After the requests and responses are successful in Sandbox Environment, you can request to enable Production Access to Chirp API. Chirp by default disables Production access for all Entities. Please contact Chirp to get the production environment enabled for your Entity. You will see the Production token in your Profile details page once Production access is enabled for your Entity. Now all that is needed is just replace the Production token with the Sandbox token and voila! you have successfully switched to Chirp Production environment.
Note: Any information created in Sandbox environment cannot be accessed in Production environment and vice versa.
2.2.1. IP Whitelisting
The Production environment is restricted to work only for whitelisted IPs. You can either contact support at support@chirp.digital to whitelist an IP or login to the Portal as the Entity admin and request an ip to whitelist under the WhiteListing menu API. The requested IP will be approved or denied by chirp and you can see the approved whitelisted IP list from the table. Please refer to the screenshot below for further assistance.

Figure 13: Managing IP Whitelisting
2.3. Consuming Chirp API Services
The following sections provide more information about consuming Chirp API services. For additional technical specifications, please check the Chirp API documents in Postman via this link:
https://documenter.getpostman.com/view/24377249/2s8YeuKAisChirp API supports both JSON and XML type responses. To get your desired type of response, simply pass Accept header with “text/xml” for an XML response and “application/json” for a JSON response. By default, the API sends JSON type response if no Accept header is passed along the request.
2.3.1 API Endpoints
2.3.1.1. createRequest
The createRequest endpoint should be used for creating a request for a customer. Once a request is successfully created, a request code is generated for the created request and sent back in the response along with other request specific details.
Payload Field Definition
# | Field Name | Data Type | Description |
---|---|---|---|
1 | cusFirstName* | String | First name of the customer |
2 | cusLastName* | String | Last name of the customer |
3 | cusEmail* | String | Customer’s Email |
4 | cusAccNumber | String | Customer’s Account Number |
5 | cusAbaNumber | String | Customer’s Routing Number |
6 | cusAccType* | String | Customer’s Account Type |
7 | bankName | String | Customer’s bank name |
8 | cusPhone* | String | Customer’s Phone Number |
9 | customerId | String | The customer id can represent the Unique ID of a customer record used in the system that integrates with Chirp that retains a reference back to Chirp’s requestCode. For example, this can be a customer id or any other unique identifier in the system of record for connecting the Chirp request code with that customer. |
10 | notificationEmail | String | Notification Email to receive request status notification updates for the request. This email is used to link to the Customer Level REQUEST_STATUS notification created by Chirp. |
11 | lastFourDigitsOfDebitCard | String | A four-digit numeric value representing the last four digits of the user's debit card used for payment or identification purposes on the website. |
12 | productId | String | The productId can represent a Unique ID in the system integrated with Chirp that retains a reference back to Chirp’s requestCode. For example, this can be a loan id, application id or any other unique identifier in the system of record for connecting the Chirp requestCode with that product. |
13 | leadId | String | Lead Id typically refers to a unique identifier assigned for a lead provider in a system. |
14 | leadProvider | String | Lead Provider name associated with a particular lead. |
15 | requestXtraHistory | Boolean | Request to retrieve up to 24 months of transaction history. Not all financial institutions will support this request. This is an enhanced endpoint and requires activation by Chirp. Please contact Chirp for more information. Requesting Xtra History will not prevent the createRequest action. All status updates will be sent via the XTRAHISTORY_STATUS notification. |
16 | subtype | String | This indicates the subtype of the request (SUBSCRIPTION/PAYG). This field will consider if the product of the entity is in the FLEX plan type. |
17 | requestAccountVerification | Boolean | Request to retrieve account and routing numbers for a customer's account. Not all financial institutions will support this request. This is an enhanced endpoint and requires activation by Chirp. Please contact Chirp for more information. |
18 | requestAccountOwner | Boolean | Request to retrieve account owner data for a customer's account. Not all financial institutions will support this request. This is an enhanced endpoint and requires activation by Chirp. Please contact Chirp for more information. |
19 | notifyIf | Array of Strings |
This field specifies the conditions for sending request status notification updates.
Possible values include: "ALL" – Sends notifications for all status updates. "VERIFIED" – Sends notifications only when the request is verified. "ATTEMPTED" – Sends notifications only when an attempt is made. If "ALL" is specified, notifications will be sent for all status updates; otherwise, they will be sent only for the specified statuses. The notificationEmail and notifyIf fields are mandatory to create an automated Customer Level REQUEST_STATUS notification in Chirp. |
Fields with * appended are mandatory information to pass for creating a request. Any request passed without mandatory information will be restricted from creating the request and appropriate error code and message will be returned in the response. Please check Understanding Error Messages section to know more about error messages and codes returned for various scenarios.
Sample Request Payload
{ "cusFirstName":"John", "cusLastName":"Doe", "cusEmail":"johndoe@somedomain.com", "cusAccNumber":"546561121", "cusAbaNumber": "322070381", "cusAccType": "Checking", "bankName":"chirp_test_bank", "cusPhone": "+10000000000", "customerId": "1234", "notificationEmail": "support@chirp.digital", "notifyIf" : ["ATTEMPTED", "VERIFIED"], "lastFourDigitsOfDebitCard" : "1234", "productId": "4533", "leadId" : "LEAD-123", "leadProvider" : "LEAD-ABC", "requestXtraHistory" : true, "subtype" : "SUBSCRIPTION", "requestAccountVerification" : true, "requestAccountOwner" : true }
Note: The above response is just an example. Please do not use the values present in this sample to create a request.
Response Field Definitions
# | Field Name | Data Type | Description |
---|---|---|---|
1 | RequestCode | String | Code to uniquely identify the request. |
2 | RequestId | String | Unique identifier for request details saved |
3 | CustomerIdentifier | String | The customer id can represent the Unique ID of a customer record used in the system that integrates with Chirp that retains a reference back to Chirp’s requestCode. For example, this can be a customer id or any other unique identifier in the system of record for connecting the Chirp request code with that customer |
4 | EmailAddress | String | Customer’s email address |
5 | InstitutionUrl | String | Customer’s bank website URL |
6 | WidgetURL | String | URL to integrate bank verification widget to lender’s website |
7 | ChirpVerificationURL | String | URL for customer to undergo bank verification process. |
7 | LendMateVerificationURL | String | URL for customer to undergo bank verification process. |
8 | cusAccNumber | String | Customer’s bank account number |
9 | cusAccType | String | Customer’s bank account type |
10 | FirstName | String | Customer’ first name |
11 | LastName | String | Customer’ last name |
12 | AddedOn | Date String | Timestamp of request created. |
13 | notificationEmail | String | Notification email address where notification regarding request updates will be sent. |
14 | Status | Integer | Status of the request 0 – unverified, 1 – verified, 2 - rejected, 3 – expired |
15 | Success | Boolean | Response result of request creation |
16 | AddedVia | String | Mode of the request created which is either API/Portal |
17 | lastFourDigitsOfDebitCard | String | A four-digit numeric value representing the last four digits of the user's debit card used for payment or identification purposes on the website. |
18 | ProductId | String | The productId can represent a Unique ID in the system integrated with Chirp that retains a reference back to Chirp’s requestCode. For example, this can be a loan id, application id or any other unique identifier in the system of record for connecting the Chirp requestCode with that product. |
19 | LeadId | String | Lead Id typically refers to a unique identifier assigned for a lead provider in a system. |
20 | LeadProvider | String | Lead Provider name associated with a particular lead. |
21 | requestXtraHistory | Boolean | Request to retrieve up to 24 months of transaction history. Not all financial institutions will support this request. This is an enhanced endpoint and requires activation by Chirp. Please contact Chirp for more information. |
Understanding error messages for createRequest
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If requested bank is not found | 404 | Bank not found! Please try again with a different bank name |
2 | If a request is created using invalid bank name | 400 | Please check the bank name and try again! |
3 | If a request is created using invalid email address | 400 | Please check the email address and try again! |
4 | If a request is created using invalid account type | 400 | Please check the account type and try again! |
5 | If a request is created using invalid first name | 400 | Please check the first name passed and try again! |
6 | If a request is created using invalid last name | 400 | Please check the last name passed and try again! |
7 | If a request is created using invalid phone number | 400 | Please check the phone number passed and try again! |
8 | If a request is created using invalid account number | 400 | Please check the account number passed and try again! |
9 | If a request is created using invalid ABA number | 400 | Please check the ABA number passed and try again! |
10 | If a request is created using “Chirp Test Bank” with the Production token | 406 | Please use a Sandbox token for testing using “Chirp Test Bank”. |
11 | If a request has already been verified with the passed customer details (Customer first name, Customer last name, Customer email, and Customer phone) and does not exceed the configured duplicate prevention period, the request will be considered a duplicate | 400 | Request is already created for the customer and it has also been verified. Please use the portal to create a new request for the customer. |
12 | If a request is created using invalid notifyIf field | 400 | notifyIf can only contain 'ALL', 'ATTEMPTED', or 'VERIFIED'. |
2.3.1.2. getRequestDetails
This endpoint returns the below information for all verified requests.
- Accounts linked to the primarily verified account
- Transaction data of the account verified
- Transaction data grouped with transaction type categories
- Transaction count and number of days for each account
- Debit card enrichment information
- The institution name for the account(s) associated
If this endpoint is used for a request which is not successfully verified, the request to get details will be rejected with an error message. Please check the Understanding Error Messages section for more information about handling errors.
The Request details can be retrieved only for Requests that have been authenticated and verified by the customer. For the customer to authenticate and verify their bank account, there needs to be an interface or widget presented to the customer.
Customizing Response
The response transactions of this request can be customized using query parameters in the URL.
Supported Query Parameters
numberOfDays: Specifies the total number of days for which transactions should be retrieved. This parameter filters the transactions based on the specified number of days either in ascending or descending order.
Example URL: https://chirp.digital/api/request/QLU0GU?numberOfDays=30
numberOfTransactions: Determines the total number of transactions to be included in the response.
Example URL: https://chirp.digital/api/request/QLU0GU?numberOfTransactions=50
sort: Specifies the sorting order of the transactions. It can be either ascending or descending.
Example URL: https://chirp.digital/api/request/QLU0GU?sort=ASCENDING
Below is the table explaining the response returned from getRequestDetails,
# | Field Name | Description |
---|---|---|
1 | Request Code | Request code of the respective request |
2 | Success | Response result of the request |
3 | Accounts | All the accounts that are linked with the verified bank account |
4 | TransactionSummaries | Transaction data of the verified account |
5 | TransactionAnalysisSummaries | Transaction data grouped with transaction type categories |
6 | AccountExpenses | Expense breakdown based on transaction data |
7 | TotalTransactions | Transaction count and number of days for each account |
8 | DebitCardEnrichment | Debit card enrichment match details |
9 | institutionName | The institution name for the account(s) associated |
Description for fields under Transaction information,
# | Field | Data Type | Description |
---|---|---|---|
1 | account_guid | String | A unique identifier for the account to which the transaction belongs. |
2 | amount | Decimal | The monetary amount of the transaction. Max length is 10,2. |
3 | category | String | The category of the transaction. |
4 | check_number | Integer | DEPRECATED. Use check_number_string instead. |
5 | check_number_string | String | The check number for the transaction. |
6 | created_at | String | The date and time the transaction was stored. |
7 | currency_code | String | The three-character ISO 4217 currency code, e.g. USD. |
8 | date | String | The date the transaction was created. |
9 | description | String | A human-readable version of the original_description field described below, e.g., "Sam's Club," "Johnny's Tavern." |
10 | guid | String | A unique identifier for the transaction. |
11 | is_bill_pay | Boolean | If the transaction is a bill pay, this field will be true. Otherwise, this field will be false. |
12 | is_direct_deposit | Boolean | If the transaction is a direct deposit, this field will be true. Otherwise, this field will be false. |
13 | is_expense | Boolean | If the transaction is an expense, this field will be true. Otherwise, this field will be false. |
14 | is_fee | Boolean | If the transaction is a fee, this field will be true. Otherwise, this field will be false. |
15 | is_income | Boolean | If the transaction is income, this field will be true. Otherwise, this field will be false. |
16 | is_international | Boolean | If the transaction is international as defined by the data provider, this field will be true. If the data provider determines it is not international, then it will be false. It will be null if the data provider does not have this information. |
17 | is_overdraft_fee | Boolean | If the transaction is an overdraft fee, this field will be true. Otherwise, this field will be false. |
18 | is_payroll_advance | Boolean | If the transaction is a payroll advance fee, this field will be true. Otherwise, this field will be false. |
19 | latitude | Decimal | The latitude of the location where the transaction occurred. The number is a signed decimal. |
20 | longitude | Decimal | The longitude of the location where the transaction occurred. The number is a signed decimal. |
21 | member_guid | String | A unique identifier for the member to which the transaction belongs. |
22 | memo | String | This field contains additional descriptive information about the transaction. |
23 | merchant_category_code | Integer | The ISO 18245 category code for the transaction. |
24 | merchant_guid | String | The unique identifier for the merchant associated with this transaction. |
25 | original_description | String | The original description of the transaction as provided by our data feed. See description above for more information. |
26 | posted_at | String | The date and time the transaction was posted. |
27 | status | String | The status of the transaction, i.e., POSTED or PENDING. |
28 | top_level_category | String | The parent category that this transaction's category is assigned to. |
29 | transacted_at | String | The date and time the transaction took place. |
30 | type | String | The type of transaction, i.e., CREDIT or DEBIT. |
31 | updated_at | String | The date and time the transaction was updated. |
32 | user_guid | String | A unique identifier for the user to which this transaction belongs. |
33 | is_recurring | Boolean | Recurring payment or transaction |
34 | account_id | String | The identifier for the account associated with the transaction |
35 | category_guid | String | The identifier for the category of the transaction |
36 | id | String | The unique partner-defined identifier for the transaction. This can only be set for partner-managed transactions. It should be ignored for user-managed transactions, even in occasional cases where it may return with a value |
37 | is_subscription | Boolean | If transaction represents a payment for a subscription service such as Netflix or Audible |
38 | localized_description | String | A human-readable description of the transaction, provided in a local language |
39 | localized_memo | String | Additional descriptive information about the transaction, provided in a local language |
40 | merchant_location_guid | String | The identifier for the merchant_location associated with this transaction |
41 | user_id | String | The unique identifier for the user associated with the transaction |
42 | categoryCode | String | The category code of the transaction |
43 | parentCategoryCode | String | The parent category code of the transaction |
Description for additional or optional fields under Transaction information,
# | Field | Data Type | Description |
---|---|---|---|
1 | chirpAccountId | String | The account's unique identifier, as defined by Chirp |
2 | chirpTransactionId | String | The transaction's unique identifier, as defined by Chirp |
Description for fields under Account information,
# | Field | Data Type | Description |
---|---|---|---|
1 | account_number | string | The account number. This will typically be a masked or partial account number. |
2 | apr | Decimal | Annual Percentage Rate. Max length is 10,6. |
3 | apy | Decimal | Annual Percentage Yield. Max length is 10,6. |
4 | available_balance | Decimal | The balance currently available in an account. Max length is 14,2. |
5 | available_credit | Decimal | The currently available credit balance of an account. This field is for accounts with types CREDIT CARD and LINE OF CREDIT. |
6 | balance | Decimal | An account's current balance. Max length is 14,2. |
7 | cash_balance | Decimal | The cash balance of the account. Max length is 14,2. |
8 | created_at | String | The date and time the account was created. |
9 | credit_limit | Decimal | The credit limit for the account. Max length is 10,2. |
10 | currency_code | String | The three-character ISO 4217 currency code, e.g. USD. |
11 | guid | String | Unique identifier for the account. |
12 | holdings_value | Decimal | The value of the holdings associated with the account. |
13 | institution_code | String | Unique identifier for the financial institution which holds the account. |
14 | interest_rate | Decimal | Interest rate. Max length is 10,6. |
15 | is_closed | Boolean | If an account is closed, this field will be true. Otherwise, this field will be false. |
16 | member_guid | String | Unique identifier for the member to which this account belongs. |
17 | type | String | The main type of an account, e.g., INVESTMENT, PREPAID, or SAVINGS. |
18 | updated_at | String | The date and time at which the account was last updated. |
19 | user_guid | String | A unique identifier for the user to which the account belongs. |
20 | routing_number | String | The routing number for the account. |
21 | insured_name | String | The date and time the account was created |
22 | cash_surrender_value | Decimal | Money paid to the policy holder or annuity holder in the event the policy is voluntarily terminated before it matures, or the insured event occurs |
23 | day_payment_is_due | String | The day of the month the payment is due. e.g 14 |
24 | death_benefit | Integer | The amount paid to the beneficiary of the account upon death of the account owner |
25 | last_payment | Decimal | The amount of the recent payment on the account |
26 | loan_amount | Decimal | The amount of the loan associated with the account |
27 | matures_on | String | The date on which the account matures |
28 | minimum_balance | Decimal | The minimum balance of the account |
29 | minimum_payment | Decimal | The minimum payment required for an account. This can apply to any debt account |
30 | name | String | The human-readable name for the account |
31 | original_balance | Decimal | The original balance of the account. This will always be positive |
32 | pay_out_amount | String | The amount paid out to the insured person or beneficiary under the conditions of the insurance policy |
33 | payoff_balance | Decimal | The payoff balance for a debt account. This will normally be a positive number |
34 | premium_amount | Decimal | The insurance policy's premium amount |
35 | started_on | String | The date on which a debt account was started |
36 | total_account_value | Decimal | The total combining both long and short positions, the sweep account and/or cash balance, and any margin debt linked to a specific account. This figure encompasses the aggregate market value of all positions within the account, offset by any debit balance and the value of short options positions that are profitable. This cumulative value can be negative and should not be misconstrued as an account balance |
37 | subtype | String | The account's subtype, e.g., PLAN_401_K, MONEY_MARKET, or HOME_EQUITY |
38 | last_payment_at | String | The date and time of the most recent payment on the account |
39 | payment_due_at | String | The date and time at which the next payment is due on the account |
40 | account_id | String | The unique identifier for the account |
Description for additional or optional fields under Account information,
# | Field | Data Type | Description |
---|---|---|---|
1 | requestCode | String | Unique code assigned for a customer request |
2 | entityId | String | Unique identifier for an entity |
3 | profileId | String | Unique identifier for a profile associated with an entity |
4 | accountMatch | Boolean | Denotes if the provided account number matches with the account number returned by the financial institution |
5 | addedOn | String | The timestamp when the account data for the customer is added in Chirp |
6 | modifiedOn | String | The timestamp when the account data for the customer is last modified in Chirp |
7 | chirpAccountId | String | The account's unique identifier, as defined by Chirp |
Description for fields under TransactionAnalysisSummaries information,
# | Field | Data Type | Description |
---|---|---|---|
1 | category | String | A label identifying the type of transaction, for instance, "FEE" |
2 | total | Decimal | The total number of transactions within this category |
3 | amount | String | The combined total amount for all transactions in this category, for instance, "$32.00" |
4 | recentTransactionAmount | String | The amount of the most recent transaction in this category, for instance, "$2.00" |
5 | recentTransactionCount | Decimal | The number of recent transactions, for instance, 1 |
6 | categoryName | String | The more descriptive name of the category, such as "Fees & Charges" |
7 | transaction | Array | Transactions associated with the category |
Understanding error messages for getRequestDetails
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If requesting details for an expired request | 406 | Request status is expired. Please try again with a verified request code |
2 | If requesting details for a rejected request | 406 | Request status is rejected. Please try again with a verified request code |
3 | If requesting details from a request code that has not been verified | 406 | Request status is unverified. Please verify the request and try again |
2.3.1.3. getRequestStatus
The getRequestStatus endpoint is used to get the current status of a request along with basic request information. Please check the Understanding Error Messages section for more details about handling errors.
Example success response:
Status code: 200
{ "success": true, "response": { "RequestCode": "QLU0GU", "Status": "Attempted", "FirstName": "John", "LastName": "Doe", "Environment": "dev", "Mode": "Portal", "VerificationLink": "https://chirp.digital/api/verify?requestCode=QLU0GU", "SelectedBank": "Chirp Test Bank", "isAccountConnected": false, "isLinkExpired": false, "LastAggregatedAt": "2024-03-12T04:59:15.273Z", "connectionStatus": "Subscribed", "statusDetails": "Attempted - Credential Error" } }
Response Field Definitions for getRequestStatus
# | Field Name | Description |
---|---|---|
1 | RequestCode | Request code passed |
2 | Status | Status of the request code passed - “Verified”, “Attempted”, “Rejected”,”Unverified - No Customer Action”, “Unverified - Incomplete Customer Action”, ”Expired” |
3 | FirstName | Customer’s first name |
4 | LastName | Customer’s last name |
5 | Environment | Environment of the request code whether it is dev(Sandbox)/prod(Production) |
6 | Mode | Mode of the request created which is either API/Portal |
7 | Verification Link | Verification link to be used for customer’s financial verification |
8 | Selected Bank | Customer’s Selected bank for verification |
9 | isAccountConnected | Denotes if the customer's account is linked and connected |
10 | isLinkExpired | Denotes if the verification link can be used any further |
11 | LastAggregatedAt | Timestamp when the customer data has been updated. Represented as UTC |
12 | connectionStatus | Connection status of the request. This field returns Subscribed/Unsubscribed or Connected/Disconnected or NA as a value based on the plan type |
13 | statusDetails | Status details of the request code passed - ”Unverified - No Customer Action”, “Unverified - Incomplete Customer Action”, “Attempted - Bank Error”, “Attempted - In Progress”, “Attempted - Credential Error” |
2.3.1.4. refreshRequest
The refreshRequest endpoint is used to aggregate and pull updated transactions and account data for a request that has already been successfully verified or refreshed.
The refreshRequest is a synchronous operation. Due to the nature of the synchronous operation the user/process that initiates the refresh should wait for a response before moving on to the next step or moving away from the UI.
Attempting to refresh a request within 3 hours of a successful verification or refresh will not be permitted. Chirp will respond with a “405 not allowed” status message. Please check the “Understanding Error Messages” section for more information about error handling.
# | Tag | Description |
---|---|---|
1 | bankName | Name of the customer’s Institution |
2 | aggregatedAt | Last updated timestamp when aggregation was successful |
3 | status | Last updated status of the request being refreshed |
4 | isBeingAggregated | Denotes if request is still being aggregated in the background |
5 | denialReason | Shows denial reason for a failed bank refresh attempt |
Example success response:
Status code: 200
{ "success": true, "status": "Verified", "aggregatedAt": "2020-05-29T07:10:43Z", "isBeingAggregated ": true, "bankName": "Chirp Test Bank" }
Understanding error messages for refreshRequest
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If Bank Refresh is not enabled for this profile. | 400 | Bank Refresh is not enabled for this profile. |
2 | If the request code is deleted while refreshRequest is attempted | 405 | Your request code is deleted. Please contact administrator. |
3 | If the request code is unsubscribed/disconnected | 405 | Your request is unsubscribed/disconnected. Please try again with a different request code. Contact Chirp Support for more assistance, support@chirp.digital |
4 | If the request code is unsubscribed/disconnected while refreshRequest is attempted | 405 | Your request is unsubscribed/disconnected. Please try again with a different request code. Contact Chirp Support for more assistance, support@chirp.digital |
5 | If request code is not verified | 405 | Your request code is not verified. Please complete bank verification and try again. |
6 | If the request code is expired | 405 | Your request code is expired. Please create a new request and try again. |
7 | If refreshRequest is attempted within 3 hrs of a successful verified or refreshed customer. | 405 | A request to refresh was attempted within 3 hours. Please try again later. |
2.3.1.5. unsubscribeRequest
The unsubscribeRequest endpoint is used to unsubscribe Subscription based customers and disconnect PAYG (Pay As You Go) based customers from an Entity. Unsubscribing a customer removes the ability to request a refresh of transactions for that customer. However, the last successful set of transactions that were retrieved for an unsubscribed customer will be retained. Please review the Understanding Error Messages section for more details about handling errors.
Note: This action is permanent and cannot be reverted
Example success response:
Status code: 200
{ “success”: “true”, “message”: "Customer has been unsubscribed or disconnected successfully" }
Understanding error messages for unsubscribeRequest
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the request code is deleted | 405 | Your request code is deleted. Please contact administrator. |
2 | If the request code is unsubscribed/disconnected already | 405 | Invalid action attempted. Request is unsubscribed/disconnected already. |
3 | Invalid action | 405 | Invalid Action Attempted. This request code cannot be unsubscribed/disconnected. |
4 | If the request code is not eligible to be unsubscribed/disconnected | 405 | Invalid Action Attempted. Request was never in a subscribed/connected state so it cannot be unsubscribed/disconnected |
2.3.1.6. getSummaryInfoByRequestCode
This endpoint returns basic and additional summary information for a verified request. Request code and account number are mandatory fields to pass. Request code can be taken from the response returned by createRequest endpoint. To obtain the accountNumber or chirpAccountId call getRequestAccountDetails. Then use the "account_number" or "chirpAccountId" from the response.
Example success response:
Status code: 200
{ "success": true, "requestCode": "QLU0GU", "availableBalance": "$ 1000.00", "asOfdate": "6/21/2022, 1:42 AM", "currentBalance": "$ 1000.00", "customerFirstName": "John", "customerLastName": "Doe", "customerEmail": "johndoe@somedomain.com", "customerAccountInfo": { "account_number": "1027261114", "apr": null, "apy": null, "available_credit": null, "cash_balance": null, "created_at": "2022-06-21T06:42:19Z", "credit_limit": null, "currency_code": null, "holdings_value": null, "interest_rate": null, "institution_code": "chirpbank", "insured_name": null, "is_closed": false, "type": "SAVINGS", "updated_at": "2022-06-21T06:42:19Z", "routing_number": "12345", "chirpAccountId": "ACC-2171ee40-1290-11ef-b135-150631c74239", }, "customerAccountMatchStatus": "No Match", "customerAccountMatchStatusDescription": "The user entered account number does not match the account number returned by the financial institution", "customerRoutingNumberMatchStatus": "No Match", "customerRoutingNumberMatchStatusDescription": "The user entered routing number does not match the routing number returned by the financial institution", "activityByMonth": [ { "month": "All", "averageDailyBalance": "$ -461.64", "averageMonthlyBalance": "$ -461.64", "totalCredit": "$ 4219.27", "totalDebit": "$ 1843.64", "totalpayroll": "$ 0.00", "totalNet": "$ 2375.63" }, { "month": "Mar, 2022", "averageDailyBalance": "$ -1344.60", "averageMonthlyBalance": "$ -1344.60", "totalCredit": "$ 94.22", "totalDebit": "$ 75.01", "totalPayroll": "$ 0.00", "totalNet": "$ 19.21" }, { "month": "Apr, 2022", "averageDailyBalance": "$ -1093.16", "averageMonthlyBalance": "$ -1093.16", "totalCredit": "$ 1484.33", "totalDebit": "$ 800.60", "totalPayroll": "$ 0.00", "totalNet": "$ 683.73" }, { "month": "May, 2022", "averageDailyBalance": "$ -385.37", "averageMonthlyBalance": "$ -385.37", "totalCredit": "$ 1226.29", "totalDebit": "$ 633.95", "totalPayroll": "$ 0.00", "totalNet": "$ 592.34" }, { "month": "Jun, 2022", "averageDailyBalance": "$ 547.83", "averageMonthlyBalance": "$ 547.83", "totalCredit": "$ 1414.43", "totalDebit": "$ 334.08", "totalPayroll": "$ 0.00", "totalNet": "$ 1080.35" } ], "totalTransactions": 168, "numberOfDays": 83, "customerEnteredAccountNumber": "546561121", "customerEnteredRoutingNumber": "322070381" }
Response Field Definitions for getSummaryInfoByRequestCode,
# | Field Name | Description |
---|---|---|
1 | success | Response result of the request |
2 | requestCode | Request code of the respective request |
3 | availableBalance | The balance currently available in an account |
4 | customerFirstName | First name of the customer |
5 | customerLastName | Last name of the customer |
6 | customerEmail | Email of the customer |
7 | customerAccountInfo | Account info of the connected customer |
8 | asOfdate | Request last updated date |
9 | currentBalance | An account's current balance |
10 | customerAccountMatchStatus | The current match status of the account number entered by the user versus the account number returned by the financial institution |
11 | customerAccountMatchStatusDescription | Description of the account number match status value |
12 | totalTransactions | Total number of transactions returned |
13 | numberOfDays | Total number of days of the transactions returned since inception till date |
14 | customerRoutingNumberMatchStatus | The current match status of the routing number entered by the user versus the routing number returned by the financial institution |
15 | customerRoutingNumberMatchStatusDescription | Description of the routing number match status value |
16 | customerEnteredAccountNumber | Customer’s account number entered into Chirp as part of creating the request. Could have been entered in the Portal or sent via API by the integration partner |
17 | customerEnteredRoutingNumber | Customer’s routing number entered into Chirp as part of creating the request. Could have been entered in the Portal or sent via API by the integration partner |
Description for fields under customerAccountInfo,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | account_number | String | The account number of the customer. This will typically be a masked or partial account number. |
2 | apr | Decimal | Annual Percentage Rate |
3 | apy | Decimal | Annual Percentage Yield |
4 | available_credit | Decimal | The currently available credit balance of an account. |
5 | cash_balance | Decimal | The cash balance of the account |
6 | created_at | String | The date and time the account was created |
7 | credit_limit | Decimal | The credit limit for the account |
8 | currency_code | String | The three-character ISO 4217 currency code |
9 | holdings_value | Decimal | The value of the holdings associated with the account |
10 | interest_rate | Decimal | Interest rate |
11 | institution_code | String | Unique identifier for the financial institution which holds the account |
12 | insured_name | String | The name of the insured individual |
13 | is_closed | Boolean | If an account is closed, this field will be true. Otherwise, this field will be false |
14 | type | String | The main type of an account, e.g., INVESTMENT, PREPAID, or SAVINGS |
15 | updated_at | String | The date and time at which the account was last updated |
16 | routing_number | String | The routing number for the account. |
Description for additional or optional fields under customerAccountInfo,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | chirpAccountId | String | The account's unique identifier, as defined by Chirp |
Description for fields under activityByMonth,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | averageDailyBalance | String | Shows month and year for which the activity is calculated. Shows ‘All’ as value for overall time period calculation |
2 | month | String | Average daily balance of the customer |
3 | averageMonthlyBalance | String | Average monthly balance of the customer |
4 | totalCredit | String | Total credit amount returned for the customer |
5 | totalDebit | String | Total debit amount returned for the customer |
6 | totalpayroll | String | Total payroll amount returned for the customer |
7 | totalNet | String | Net amount returned for the customer |
Understanding error messages for getSummaryInfoByRequestCode
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If account number field is empty or invalid | 400 | Account number is mandatory. Please try again with a valid account number. |
2 | If requesting details for an expired request | 406 | Request status is expired. Please try again with a verified request code |
3 | If requesting details for a rejected request | 406 | Request status is rejected. Please try again with a verified request code |
4 | If requesting details from a request code that has not been verified | 406 | Request status is unverified. Please verify the request and try again |
5 | If the account number passed is invalid | 400 | Account number passed is invalid. Please try again with a valid account number. |
2.3.1.7. generateAuthTokenForReportUI
The generateAuthTokenForReportUI endpoint should be used for generating a one-time usable token for rendering verification reports hosted as an Iframe in a webpage. The token generated is only valid for a single use and any subsequent usage of the same token will result in Authorization errors. This endpoint requires one of the following combinations to be passed in the username and password fields for generating a valid token:
1. Entity username in the username field and Entity password in the password field along with the verification Request Code
2. Entity Client Id in the username field and Profile API Access Token in the password field along with the verification Request Code.
Request Field Definitions
# | Field Name | Description |
---|---|---|
1 | username* | <Entity user's username> or <Entity Client ID> |
2 | password* | <Entity user's password> or <Entity Profile Token> |
3 | requestCode* | Verified request code |
Fields appending with an asterisk (*) are required for creating a request. Any request missing required fields will be denied, and the corresponding error code with message will be returned in response. Please check the “Understanding Error Messages” section for more information about error handling.
Sample Request Payload
{ "username":"<Entity user's username> or <Entity Client ID>", "password":"<Entity user's password> or <Entity Profile Token>", "requestCode":"<request code>", }
Request Field Definitions
# | Field Name | Description |
---|---|---|
1 | token | One-time usable token generated for rendering a customer report via the hosted render report UI V2 |
2 | validUpto | The expiration time until the generated token is valid. Timezone is CST |
3 | validForRequestCode | The request code for which the token is valid |
Status code: 200
{ "success": true, "result": { "token":"eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJlbnRpdHlJZCI6IjVmZjFl MWQwZDQyMzRiMDJkYTc2ZWJmYiIsInVzZXJJZCI6IjVmZjFlMWQwZDQyMzRiM DJkYTc2ZWJmYSIsInJlcXVlc3RDb2RlIjoiTENVWEk2IiwicHJvZmlsZUlkIj oiNWZmMWUxZDBkNDIzNGIwMmRhNzZlYmZjIiwiaWF0IjoxNjI3OTAyMTA5LC JleHAiOjE2Mjc5MjAxMDl9.Aq_VU0lgNl1v-qI690xRqaxUuEViARdV1JCq9K 7v19v2H0wd3V8O4JQLwBkOl-mhqNaO6P9qnnSPREvrANp4nAZhVB3OVfgQKX18 eEVVAaIeLf8Cr7GG2ml1jJgasN48ouK9Hs5utVJEGvfKpRT3Qa_EZaw139WzSL GPgDPI120", "validUpto": "8/2/2022, 11:01 AM", "validForRequestCode": "QLU0GU" } }
Understanding error messages for generateAuthTokenForReportUI
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the request code field is empty | 400 | Request code is missing. Please try again with a valid request code. |
2 | If the request code is invalid | 400 | Request code <requestCode> is invalid. Please contact the company you are working with for further assistance. |
3 | If request code passed is not verified | 400 | Request must be verified before a token can be generated. Please try again with a verified request. |
4 | If the Request code is not associated with the entity. | 400 | Request code is not associated with the entity. |
5 | If user authorization failed due to invalid creds | 401 | User authorization failed due to invalid credentials. Please try again with valid credentials. |
2.3.1.8. getRequestReportAsPDF
The getRequestReportAsPDF endpoint is used to generate a PDF report for a successfully verified request. The endpoint should only be called after a successful verified request has been completed. If webhooks are not being used the status of a request can be found using the getRequestStatus endpoint.
After calling getRequestReportAsPDF with a successfully completed verification a link to download the generated PDF report is generated and returned in the response. The link can be used to download the generated PDF report. The link and the generated PDF report are valid for 12 hours after being generated. After 12 hours the link and PDF report will be removed from the system.
The request code and account number are mandatory fields to pass. Request code can be taken from the response returned by createRequest endpoint and Account number can be taken from getRequestDetails response.
Example getRequestReportAsPDF Request:
{ "requestCode": "QLU0GU", "accountNumber": “XXXXXX” }
Example Successful Response:
{ "success": true, "requestCode": "QLU0GU", "fileDownloadLink": "https://chirp.digital/public/XXXXXX_2022-06-01T02-12" }
Response Field Definitions for getRequestReportAsPDF,
# | Field Name | Description |
---|---|---|
1 | success | Response result of the request |
2 | requestCode | Request code of the respective request |
3 | fileDownloadLink | The Link to download the generated PDF report |
Understanding error messages for getRequestReportAsPDF
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the request code field is empty | 400 | Request code is missing. Please try again with a valid request code. |
2 | If account number field is empty or invalid | 400 | Account number is mandatory. Please try again with a valid account number. |
3 | If the access is forbidden | 400 | Access forbidden. Please check the environment of the API token passed and try again! |
4 | If requesting details for an expired request | 406 | Request status is expired. Please try again with a verified request code |
5 | If requesting details for a rejected request | 406 | Request status is rejected. Please try again with a verified request code |
6 | If requesting details from a request code that has not been verified | 406 | Request status is unverified. Please verify the request and try again |
2.3.1.9. updateRequestStatus
The updateRequestStatus endpoint is used to update the status of a request. The endpoint currently only supports updating the status of a request from Attempted to Rejected.
Sample Request Payload
{ "requestCode":"QLU0GU", "statusToUpdate":"REJECTED", }
Example success response:
Status code: 200
{ "success": true, "message": "The request has been updated to Rejected status successfully" }
Understanding error messages for updateRequestStatus
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If status to update is invalid | 400 | Please check the status to update and try again! |
2 | If the request code is already rejected | 400 | Request code <requestCode> cannot set to Rejected beacuse the status is already Rejected |
3 | Request code needs to be attempted before reject | 400 | Current status of the request is <status> and cannot be set to rejected. |
4 | If entered customer not found | 404 | Customer not found. |
2.3.1.10. getRequestTrackInfo
The getRequestTrackInfo endpoint takes upto 1000 request codes per request and returns all relevant track level information. This information can be used to sync the data in the LMS system. The response returns information for only valid and applicable request codes passed while invalid request codes and requests that do not belong to the profile associated with the authorization token are ignored.
Sample Request Payload
{ "requestCodes" : "[\"QLU0GU\",\"YYYYYY\",\"ZZZZZZ\"]" }
Example success response:
Status code: 200
{ "success": true, "result": [ { "requestCode": "QLU0GU", "customerName": "John Deo", "email": "johndoe@somedomain.com", "phone": "1111111111", "entityName": "Test Entity", "profileName": "Test Profile", "accessInfo": "Portal", "bankName": "Chirp Test Bank", "status": "Verified", "planType": "FLEX", "subtype" : "SUBSCRIPTION", "subscriptionStatus": "NA", "addedOn": "2022-08-08T12:10:49.826Z", "attemptedOn": "2022-08-08T12:11:16.998Z", "verifiedOn": "2022-08-08T12:22:16.998Z", "rejectedOn": "NA", "unsubscribedOn": "2022-08-08T12:11:36.507Z", "statusDetails": "NA" } ] }
Note:
1. The requestCodes field in the payload should be stringified.
Response Field Definitions for getRequestTrackInfo,
# | Field Name | Description |
---|---|---|
1 | requestCode | Code to uniquely identify the request |
2 | customerName | Customer’s first and last name |
3 | Customer’s email | |
4 | phone | Customer’s phone |
5 | entityName | Entity business name to which the customer is associated |
6 | profileName | Profile name to which the customer is associated |
7 | accessInfo | Access of the request created, either API/Portal |
8 | bankName | Customer’s selected bank |
9 | status | Status of the request code - “Unverified”, “verified”, “Attempted”, “Rejected”, “Expired” |
10 | planType | Plan type of the request code - SUBSCRIPTION/PAYG/FLEX |
11 | subscriptionStatus | Subscription of the request code - Subscribed/Unsubscribed |
12 | addedOn | Timestamp when request is added |
13 | attemptedOn | Timestamp when request is attempted |
14 | verifiedOn | Timestamp when request is verified |
15 | rejectedOn | Timestamp when request is rejected |
16 | unsubscribedOn | Timestamp when request is unsubscribed |
17 | subtype | Subtype of the request code - SUBSCRIPTION/PAYG. This field will be returned if the planType is "FLEX" |
18 | statusDetails | Status details of the request code passed - ”Unverified - No Customer Action”, “Unverified - Incomplete Customer Action”, “Attempted - Bank Error”, “Attempted - In Progress”, “Attempted - Credential Error” |
Understanding error messages for getRequestTrackInfo
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the request code field is empty | 400 | The requestCodes field is mandatory. Please try again with a valid payload in the request body |
2 | If the parsed stringified data is not an array of strings or invalid | 400 | The requestCodes field is in invalid format. Please try again with a valid payload in the request body |
3 | If the payload contains more than 1000 request codes | 400 | Maximum allowed request code limit is 1000. Please try again with a valid payload in the request body |
2.3.1.11. createCustomerNotification
The createCustomerNotification endpoint is used to create a customer level configuration for triggering Chirp notifications. If an entity has its own notification configuration added then the notification configuration added for the customer level will override the entity level notification configuration.
Payload Field Definition for createCustomerNotification,
# | Field | Data Type | Description |
---|---|---|---|
1 | name* | String | Name for the customer notification |
2 | requestCode* | String | Code to uniquely identify the request. |
3 | type* | String | Type of notification |
4 | rule* | String | Rule of the notification type |
5 | amount | Number | Amount to filter customer’s financial informations |
6 | webhookUrl | Array of strings | Webhook url to send chirp notifications(Maximum of 2 URLs can be configured for REQUEST and REFRESH type) |
7 | emails | Array of strings | Emails to send chirp notifications |
8 | notifyViaEmail* | Boolean | Boolean value to active email notifications |
9 | notifyViaWebhook* | Boolean | Boolean value to active webhook notifications |
10 | active* | Boolean | Boolean value to make the notification active |
11 | keywords | Array of strings | Keywords to match the description of a transaction |
12 | enableRetryTimeout | Boolean | Boolean value to activate retrying timeout webhooks |
13 | retryTimeout | Number | Automatically retry posting the webhook notification if the initial attempt results in a timeout. This number field denotes the interval for retrying in hours. |
Fields with * appended are mandatory information to pass for creating a customer notification. Any request passed without mandatory information will be restricted from creating the customer notification and appropriate error code and message will be returned in the response. Please check Understanding Error Messages section to know more about error messages and codes returned for various scenarios.
Sample Request Payload
{ "name":"YYYYYYYY", "requestCode" : "QLU0GU", "type":"DEPOSIT", "rule" : "GREATER_THAN", "amount" : 44, "emails" : ["johndoa@somedomain.com"], "notifyViaEmail" : true, "notifyViaWebhook" : true, "webhookUrl" : ["https://example.com"], "active" : true, "enableRetryTimeout" : true, "retryTimeout" : 2 }
Example success response:
Status code: 200
{ "success": true, "message": "Customer notification configuration added successfully!" }
Understanding error messages for createCustomerNotification
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the request code passed has already customer configuration with passed type | 409 | This customer already has a notification configuration with the type |
2 | If the notification channel is not provided | 400 | Please provide a notification channel and try again! |
3 | If passed type and rule are inappropriate | 400 | Please check the type and rule and try again! |
4 | If entered keywords are invalid | 400 | Please check the keywords and try again later. |
5 | If invalid webhook url is passed | 400 | Please check the webhookUrl and try again |
6 | If one or more invalid emails are passed | 400 | Please check the emails and try again |
7 | If notifyViaWebhook field are invalid | 400 | Please enable the notifyViaWebhook field and try again |
8 | If notifyViaEmail field are invalid | 400 | Please enable the notifyViaEmail field and try again |
9 | If invalid retryTimeout field is passed | 400 | Please check the retryTimeout and try again |
10 | If enableRetryTimeout field is invalid | 400 | Please enable the enableRetryTimeout field and try again |
11 | If the request code is other than subscription or flex-subscription plan type | 400 | Your current plan does not support this type of notification configuration. Please contact support@chirp.digital for more info |
2.3.1.12. updateCustomerNotification
The updateCustomerNotification endpoint is used to update an existing customer-level notification in Chirp
Note: If emails are required to be updated then a prior update to the field notifyViaEmail is required to set as true. If the value of notifyViaEmail is already true then no prior update is required for updating the emails fields. This applies to the field webhook also where notifyViaWebhook is the field to update as true.
Payload Field Definition for updateCustomerNotification,
# | Field | Data Type | Description |
---|---|---|---|
1 | name | String | Name for the customer notification |
2 | type | String | Type of notification |
3 | rule | String | Rule of the notification type |
4 | amount | Number | Amount to filter customer’s financial informations |
5 | webhookUrl | Array of string | Webhook url to send chirp notifications |
6 | emails | Array of strings | Emails to send chirp notifications |
7 | notifyViaEmail | Boolean | Boolean value to active email notifications |
8 | notifyViaWebhook | Boolean | Boolean value to active webhook notifications |
9 | active | Boolean | Boolean value to make the notification active |
10 | keywords | Array of strings | Keywords to match the description of a transaction |
11 | enableRetryTimeout | Boolean | Boolean value to activate retrying timeout webhooks |
12 | retryTimeout | Number | Automatically retry posting the webhook notification if the initial attempt results in a timeout. This number field denotes the interval for retrying in hours. |
Sample Request Payload
{ "name":"YYYYYYYY", "type":"DEPOSIT", "rule" : "GREATER_THAN", "amount" : 44, "emails" : ["johndoa@somedomain.com"], "notifyViaEmail" : true, "notifyViaWebhook" : true, "webhookUrl" : ["https://example.com"], "active" : true, "enableRetryTimeout" : true, "retryTimeout" : 2 }
Example success response:
Status code: 200
{ "success": true, "message": "Customer notification configuration updated successfully!" }
Response Field Definitions for updateCustomerNotification,
# | Field Name | Description |
---|---|---|
1 | success | Response result of the request |
2 | message | Success message |
Understanding error messages for updateCustomerNotification
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the request code passed has already customer configuration with passed type | 409 | This customer already has a notification configuration with the type |
2 | If passed type and rule are inappropriate | 400 | Please check the type and rule and try again! |
3 | If entered keywords are invalid | 400 | Please check the keywords and try again later. |
4 | If invalid webhook url is passed | 400 | Please check the webhookUrl field and try again |
5 | If one or more invalid emails are passed | 400 | Please check the emails and try again |
6 | If notifyViaWebhook field is invalid | 400 | Please enable the notifyViaWebhook and try again |
7 | If notifyViaEmail field is invalid | 400 | Please enable the notifyViaEmail field and try again |
8 | If webhook url passed is more than 2 for REQUEST and REFRESH type | 400 | A maximum of only 2 URLs can be configured |
9 | If invalid retryTimeout field is passed | 400 | Please check the retryTimeout and try again |
10 | If enableRetryTimeout field is invalid | 400 | Please enable the enableRetryTimeout field and try again |
2.3.1.13. getCustomerNotification
The getCustomerNotification endpoint is used to get all customer-level notifications Chirp notifications. Please check the Understanding Error Messages section for more details about handling errors.
Note: If the query param type is passed with an appropriate value then the response is filtered with it. If the request has no type value added as indicated above then all the notifications configured for the customer are returned.
Example Successful Response:
{ "success": true, "result": [ { "emails": [ "aaaaa@somedomain.com" ], "addedOn": "2023-01-04T08:01:09.515Z", "modifiedOn": "2023-01-04T08:01:09.515Z", "requestCode": "QLU0GU", "name": "YYYYYY", "cusFirstName": "John", "cusLastName": "Deo", "type": "ACC_CONNECTION_STATUS", "rule": "REMOVED", "webhookUrl": "www.example.com", "active": true, "notifyViaEmail": true, "notifyViaWebhook": true, "amount": 0, "enableRetryTimeout" : true, "retryTimeout" : 2 } ] }
Response Field Definitions for getCustomerNotification,
# | Field Name | Description |
---|---|---|
1 | success | Response result of the request |
2 | result | Notification configurations associated with the requestCode |
Understanding error messages for getCustomerNotification
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the customer has no notification added | 404 | This customer has no notification configuration added! |
2.3.1.14. removeCustomerNotification
The removeCustomerNotification endpoint is used to remove the customer-level notification from Chirp.
Example Successful Response:
{ "success": true, "message": "Customer notification configuration removed successfully!" }
Response Field Definitions for removeCustomerNotification,
# | Field Name | Description |
---|---|---|
1 | success | Response result of the request |
2 | message | Success message |
Understanding error messages for removeCustomerNotification
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the customer has no notification added | 404 | This customer has no notification configuration added! |
2.3.1.15. isRoutingNumberAvailable
This endpoint is used to find if the passed routing number associated with the financial institution is supported by Chirp or not. A simple boolean response is returned to denote the support. This endpoint is secured the same as other endpoints and requires the API token that can be found in the profile details page for authorization. More technical details and sample response information about this and other endpoints can be found on the Postman documentation.
Sandbox token only supports a dummy value such as 000000000 to be passed to help with the integration
Example Successful Response:
true
Understanding error messages for isRoutingNumberAvailable
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If routing number is empty or invalid | 400 | Routing number is mandatory |
2.3.1.16. updateCustomerId
The updateCustomerId endpoint is used to update the customer id of a request. The customer id can represent the Unique ID of a customer record used in the system that integrates with Chirp that retains a reference back to Chirp’s requestCode. For example, this can be a customer id or any other unique identifier in the system of record for connecting the Chirp request code with that customer.
Sample Request Payload
{ "customerId": “XXXXXXXXXX” }
Example success response:
Status code: 200
{ "success": true, "message": "Customer Id updated successfully", }
Understanding error messages for updateCustomerId
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the customerId field in the body is missing | 400 | Customer Id is mandatory. Please try again with a valid customer id. |
2.3.1.17. debitCardEnrichment
The endpoint is used to get the debit card enrichment of a customer by filtering transactions with debit card enrichment. Debit Card Enrichment will be performed using the last 4 digits of the debit card provided via the API as well as reporting back the last 4 digits of any additional debit cards that are found.
The transactions associated with the debit card can also be retrieved along with the response by passing the “transaction” query parameter with the value set to true in the request. If omitted from the request the transaction query parameter default value is false.
The debit card enrichment details can also be obtained for each account. To get the account details pass the “byAccount” query parameter with the value set to true in the request. If omitted from the request the “byAccount” query parameter default value is false.
Here is an example url with the query parameter “transactions” added for retrieving transactions - https://chirp.digital/api/debitCardEnrichment/QLU0GU?debitCardNumber=1234&transaction=true
Here is an example url with the query parameters “transaction” and “byAccount” added for retrieving details by account - https://chirp.digital/api/debitCardEnrichment/QLU0GU?debitCardNumber=1234&transaction=true&byAccount=true
Example success response:
Status code: 200
{ "success": true, "requestCode": "QLU0GU", "result": [ { "lastFourDebitCardNumber": "1234", "debitCardIndicatorMessage": "2 out of 1000 transaction matches", "cardMatches": true, "debitCardIndicatorStatus": "Low", "autoFlaggedDebit" : false, "transactions": [ { "category": "Utilities", "created_at": "2023-07-12T10:47:10Z", "date": "2023-07-11", "posted_at": "2023-07-12T12:00:00Z", "status": "POSTED", "top_level_category": "Bills & Utilities", "transacted_at": "2023-07-11T12:00:00Z", "type": "DEBIT", "updated_at": "2023-07-12T10:47:10Z", "account_guid": "ACT-114eddee-27c7-4661-96bb-c3d5343419ed", "account_id": "act-223434333", "amount": 58.92, "category_guid": "CAT-56a2979d-d6df-25da-f357-06282f08208e", "check_number_string": null, "currency_code": "USD", "description": "Questar Gas", "guid": "TRN-e9d83fa5-549e-43d1-afbc-c6651c47c96a", "id": "transfer-6a374f0f-488c-4258-82da-7c2c4ec5fe3f", "is_bill_pay": false, "is_direct_deposit": false, "is_expense": true, "is_fee": false, "is_income": false, "is_international": null, "is_overdraft_fee": false, "is_payroll_advance": false, "is_recurring": null, "is_subscription": false, "latitude": null, "localized_description": null, "localized_memo": null, "longitude": null, "member_guid": "MBR-9ad03e4a-1e1b-420e-984a-7da2c8c8fb7c", "member_is_managed_by_user": true, "memo": null, "merchant_category_code": null, "merchant_guid": null, "merchant_location_guid": null, "original_description": "card 1234", "user_guid": "USR-6b718e0b-b1f1-4819-96c3-dd2a340a9585", "user_id": "6d896b50-20a1-11ee-a149-6fd473c3e4b4", "categoryCode": "UTL", "parentCategoryCode": "BNU", "debitCardNumber": "1234" }, { "category": "Transfer", "created_at": "2023-07-12T10:47:19Z", "date": "2023-07-11", "posted_at": "2023-07-12T12:00:00Z", "status": "POSTED", "top_level_category": "Transfer", "transacted_at": "2023-07-11T12:00:00Z", "type": "DEBIT", "updated_at": "2023-07-12T10:47:19Z", "account_guid": "ACT-164a6ebb-be76-415e-8adc-c27853ef2eb8", "account_id": "act-6744344", "amount": 13.03, "category_guid": "CAT-bce48142-fea4-ff45-20d9-0a642d44de83", "check_number_string": null, "currency_code": "USD", "description": "Transfer From Savings", "guid": "TRN-4ba4626c-607a-4761-8e9a-24e6906085a7", "id": "transfer-7c187810-8704-4288-91f3-d7b4f2f96d5c", "is_bill_pay": false, "is_direct_deposit": false, "is_expense": true, "is_fee": false, "is_income": false, "is_international": null, "is_overdraft_fee": false, "is_payroll_advance": false, "is_recurring": null, "is_subscription": false, "latitude": null, "localized_description": null, "localized_memo": null, "longitude": null, "member_guid": "MBR-9ad03e4a-1e1b-420e-984a-7da2c8c8fb7c", "member_is_managed_by_user": true, "memo": null, "merchant_category_code": null, "merchant_guid": null, "merchant_location_guid": null, "original_description": "DEBIT XXXXXXXXXXXX1234 ", "user_guid": "USR-6b718e0b-b1f1-4819-96c3-dd2a340a9585", "user_id": "6d896b50-20a1-11ee-a149-6fd473c3e4b4", "categoryCode": "UNC", "parentCategoryCode": "TRF", "debitCardNumber": "1234" } ] } ] }
Example success response for each account:
{ "success": true, "requestCode": "QLU0GU", "result": [ { "accountName": "Checking", "accountNumber": "12345", "debitCardEnrichmentDetails": [ { "lastFourDebitCardNumber": "1234", "debitCardIndicatorMessage": "9 out of 168 transaction matches", "cardMatches": true, "autoflaggeddebit": false, "debitCardIndicatorStatus": "High" }, { "lastFourDebitCardNumber": "4567", "autoflaggeddebit": true, "debitCardIndicatorMessage": "20 out of 168 transaction matches" }, { "lastFourDebitCardNumber": "7890", "autoflaggeddebit": true, "debitCardIndicatorMessage": "28 out of 168 transaction matches" } ] }, { "accountName": "Credit Card", "accountNumber": "XXXX4545", "debitCardEnrichmentDetails": [ { "lastFourDebitCardNumber": "1234", "debitCardIndicatorMessage": "3 out of 168 transaction matches", "cardMatches": true, "autoflaggeddebit": false, "debitCardIndicatorStatus": "Low" }, { "lastFourDebitCardNumber": "4567", "autoflaggeddebit": true, "debitCardIndicatorMessage": "11 out of 168 transaction matches" }, { "lastFourDebitCardNumber": "7890", "autoflaggeddebit": true, "debitCardIndicatorMessage": "13 out of 168 transaction matches" } ] }, { "accountName": "Property", "accountNumber": "543545", "debitCardEnrichmentDetails": [ { "lastFourDebitCardNumber": "1234", "debitCardIndicatorMessage": "0 out of 166 transaction matches", "cardMatches": true, "autoflaggeddebit": false, "debitCardIndicatorStatus": "Zero" } ] }, { "accountName": "Mortgage", "accountNumber": "12987", "debitCardEnrichmentDetails": [ { "lastFourDebitCardNumber": "1234", "debitCardIndicatorMessage": "0 out of 166 transaction matches", "cardMatches": true, "autoflaggeddebit": false, "debitCardIndicatorStatus": "Zero" } ] }, { "accountName": "Loan", "accountNumber": "177654", "debitCardEnrichmentDetails": [ { "lastFourDebitCardNumber": "1234", "debitCardIndicatorMessage": "0 out of 166 transaction matches", "cardMatches": true, "autoflaggeddebit": false, "debitCardIndicatorStatus": "Zero" } ] }, { "accountName": "Investment", "accountNumber": "57123", "debitCardEnrichmentDetails": [ { "lastFourDebitCardNumber": "1234", "debitCardIndicatorMessage": "0 out of 0 transaction matches", "cardMatches": true, "autoflaggeddebit": false, "debitCardIndicatorStatus": "Zero" } ] }, { "accountName": "Savings", "accountNumber": "11119876", "debitCardEnrichmentDetails": [ { "lastFourDebitCardNumber": "1234", "debitCardIndicatorMessage": "0 out of 166 transaction matches", "cardMatches": true, "autoflaggeddebit": false, "debitCardIndicatorStatus": "Zero" } ] } ] }
Response Field Definitions for debitCardEnrichment,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | requestCode | String | Request code for a request |
3 | debitCardIndicatorStatus | String | Denotes the enrichment of debit card being connected |
4 | debitCardIndicatorMessage | String | A detailed message with match count and enrichment indicator definition |
5 | lastFourDebitCardNumber | String | Last four digits of the customer's debit card |
6 | transactions | Array | Debit Card Number related transactions |
7 | autoFlaggedDebit | Boolean | Auto flagged card and associated transactions by the system |
8 | cardMatches | Boolean | If the provided last 4 digits of debit card number matches with the flagged transactions |
Understanding error messages for debitCardEnrichment
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If invalid debit card number is passed | 400 | Please provide a valid debit card number and try again |
2 | If the entity does not have the feature of debit card enrichment | 400 | This Debit Card Enrichment Feature is no enabled for this entity/profile |
3 | If requesting details for an expired request | 406 | Request status is expired. Please try again with a verified request code |
4 | If requesting details for a rejected request | 406 | Request status is rejected. Please try again with a verified request code |
5 | If requesting details from a request code that has not been verified | 406 | Request status is unverified. Please verify the request and try again |
2.3.1.18. updateProductId
The updateProductId endpoint is used to update the productId of a request. The productId can represent a Unique ID in the system integrated with Chirp that retains a reference back to Chirp’s requestCode. For example, this can be a loan id, application id or any other unique identifier in the system of record for connecting the Chirp requestCode with that product.
Sample Request Payload
{ "productId": “XXXXXX” }
Example success response:
Status code: 200
{ "success": true, "message": "Product Id updated successfully", }
Understanding error messages for updateProductId
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the productId field in the body is missing | 400 | Product Id is mandatory. Please try again with a product id. |
2 | If the requestCode does not exist | 400 | The request code is not found. Please try again with a valid request code. |
2.3.1.19. enableScoringForRequest
The endpoint is used to enable scoring for ON_DEMAND type requests. The url also takes a query param as active to enable or disable the scoring feature for the request. The active query param defaults to true if not passed.
Example success response:
Status code: 200
{ "success": true, "message": "Scoring is enabled for this request successfully", }
Response Field Definitions for enableScoringForRequest,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | message | String | Success message |
Understanding error messages for enableScoringForRequest
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the integration settings is not enabled for the entity | 400 | Scoring is not configured for this entity |
2.3.1.20. getScoringForRequest
The getScoringForRequest endpoint is used to retrieve scoring information for a verified request. Additional scoring information can be retrieved as part of the response when the query param extensiveInfo is set to true in the request. The default value for extensiveInfo is false and if extensiveInfo is omitted from the request it will be treated as false. The score data and information is provided by Lokyata.
Here is an example request to get the extensive information from Lokyata BankAnalyze as part of the response - https://chirp.digital/api/getScoringForRequest/QLU0GU?extensiveInfo=true
Example success response for standard request:
Status code: 200
{ "success": true, "scoringInfo": { "score": "0", "requestCode": "QLU0GU", "reportStatus": "Review", "denialReason": [ { "denial_reason_code": "eligibility", "message": "inadequate and/or irregular income", "type": "INVALID_SCORE" } ], "decision": "Deny" } }
Example success response for request with extensiveInfo query param passed:
Status code: 200
{ "success": true, "scoringInfo": { "score": "0", "requestCode": "QLU0GU", "reportStatus": "Review", "denialReason": [ { "denial_reason_code": "eligibility", "message": "inadequate and/or irregular income", "type": "INVALID_SCORE" } ], "decision": "Deny", "loan_disbursement_count_total" : 4, "loan_disbursement_amount_total" : 4942.41, "loan_payments_amount_total" : null, "loan_disbursement_amount_15d" : null, "loan_disbursement_count_15d" : 1, "loan_payments_amount_15d" : null, "loan_disbursement_amount_30d" : null, "loan_disbursement_count_30d" : 1, "loan_payments_amount_30d" : null, "income_stability" : 56, "average_monthly_income" : 8563.86666666667, "last_3_paychecks_average_income" : null, "last_pay_date" : null, "last_pay_date_match" : null, "future_pay_date_1" : null, "future_pay_date_2" : null, "balance_payday_1d" : 815.430676691729, "balance_payday_3d" : 409.893063063063, "balance_payday_5d" : 985.317727272727, "minimum_balance" : -262.89, "borrower_name_match" : true, "employer_name_match" : false, "bank_name_match" : null, "net_income_match" : false, "account_number_match" : true, "routing_number_match" : false, } }
Response Field Definitions for getScoringForRequest,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | requestCode | String | Request code for a request |
3 | score | String | Denotes the score of the request code |
4 | reportStatus | String | Report status of the request code |
5 | denialReason | Array | Denial reason of the request code |
6 | decision | String | Scoring decision of the request code |
7 | loan_disbursement_count_total | Decimal | The total count of loan disbursements in the bank statement |
8 | loan_disbursement_amount_total | Decimal | The total amount of loan disbursements in the bank statement |
9 | loan_payments_amount_total | Decimal | Total loan repayment amount in the bank statement |
10 | loan_disbursement_amount_15d | Decimal | Total loan disbursement amount in the last 15 days from the time bank statement was created |
11 | loan_payments_amount_15d | Decimal | Total loan repayment amount in the last 15 days from the time bank statement was created |
12 | loan_disbursement_amount_30d | Decimal | Total loan disbursement amount in the last 30 days from the time bank statement was created |
13 | loan_disbursement_count_30d | Decimal | The total count of loan disbursements in the last 30 days |
14 | loan_payments_amount_30d | Decimal | Total loan repayment amount in the last 30 days from the time bank statement was created |
15 | income_stability | Decimal | An estimate of the average monthly income |
16 | last_3_paychecks_average_income | Decimal | Average of the transaction amount for last three paychecks |
17 | last_pay_date | String | The last date of paycheck and is entered by lead |
18 | last_pay_date_match | Boolean | Compare the last pay date entered in lead application and the last pay date we were able to find in bank statement |
19 | future_pay_date_1 | String | The 1st next pay date based on past pay dates in the bank statement. Depending on the pay frequency, it will be either day of the week or complete date |
20 | future_pay_date_2 | String | The 2nd next pay date based on past pay dates in bank statement, depending on the pay frequency, it will be either day of the week or complete date |
21 | balance_payday_1d | Decimal | An estimate of the account balance one day before the next payday |
22 | balance_payday_3d | Decimal | An estimate of the account balance three days before the next payday |
23 | balance_payday_5d | Decimal | An estimate of the account balance five days before the next payday |
24 | minimum_balance | Decimal | The minimum balance of the account |
25 | borrower_name_match | Boolean | Denotes the provided borrower name matches the name associated with application |
26 | employer_name_match | Boolean | Denotes the provided employer name matches the name associated with application |
27 | bank_name_match | Boolean | Compare the bank entered in lead application and bank selected |
28 | net_income_match | Boolean | Compare the income entered in lead application and income returned |
29 | account_number_match | Boolean | Compare the account number entered in lead application and account number selected |
30 | routing_number_match | Boolean | Compare the routing number entered in lead application and routing number selected |
31 | loan_disbursement_count_15d | Decimal | The total count of loan disbursements in the last 15 days |
32 | average_monthly_income | Decimal | An estimate of the average monthly incom |
Understanding error messages for getScoringForRequest
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the integration settings is not enabled for the entity | 400 | Scoring is not configured for this entity |
2 | If the scoring is not found for the request | 404 | Scoring info not found for this request |
2.3.1.21. updateRequestInfo
The updateRequestInfo endpoint is used to update the customer id, product id, lead id or lead provider of a request. While the customer Id, product Id, lead Id, and lead provider fields are all optional in the request body, it is imperative that at least one of these fields is provided for the update to take place.
Sample Request Payload
{ "customerId": “XXXXXXXXXX”, "productId": “YYYYYYYYY”, "leadId": “ZZZZZZZZZZZZ”, "leadProvider": “VVVVVVVV”, }
Example success response:
Status code: 200
{ "success": true, "message": "Product Id, Customer Id, Lead Id and Lead Provider updated successfully", }
Understanding error messages for updateRequestInfo
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the productId, customerId, leadId or leadProvider field in the body is empty or null | 400 | Please try again with a valid <field_name>. |
2.3.1.22. getBalanceInfo
The getBalanceInfo endpoint can be used to retrieve the account balance for a customer's account. This is an enhanced endpoint that supports OAuth bank requests and requires activation by Chirp. Please contact Chirp for more information.
Example success response:
Status code: 200
{ "success": true, "requestCode": "QLU0GU", "accounts": [ { "account_number": "1234", "available_balance": 0, "balance": 0, "name": "Chirp Checking", "routing_number": null, "subtype": null, "type": "CHECKING", "account_ownership": null, "updated_at": "2023-11-29T10:47:50Z" } ], "status" : "AVAILABLE" }
Response Field Definitions for getBalanceInfo,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | requestCode | String | Request code for a request |
3 | accounts | Array | List of user accounts, including balance details and other account-related information. |
4 | status | String | Status details of the accounts - ”AVAILABLE” - The requested data is successfully retrieved and included in the response payload, “NOT_RETURNED” - The request was successfully sent to the financial institution, but no data was returned in response., “NOT_ATTEMPTED” - No attempt was made to fetch premium data for the request. |
Description for fields under accounts information,
# | Field | Data Type | Description |
---|---|---|---|
1 | account_number | String | The account number of the customer |
2 | available_balance | Decimal | The balance currently available in an account. Max length is 14,2. |
3 | balance | Decimal | An account's current balance. Max length is 14,2. |
4 | routing_number | String | The routing number for the account |
5 | type | String | The main type of an account, e.g., INVESTMENT, PREPAID, or SAVINGS. |
6 | subtype | String | The account's subtype, e.g., PLAN_401_K, MONEY_MARKET, or HOME_EQUITY |
7 | account_ownership | String | The type of ownership associated with the account such as UNKNOWN, INDIVIDUAL, JOINT, MULTIPLE, NULL. |
8 | updated_at | String | The date and time at which the account was last updated. |
9 | name | String | The human-readable name for the account |
Understanding error messages for getBalanceInfo
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If Balance Check Feature is not enabled for the entity or if the OAuth bank request is passed. | 400 | The Balance Check Feature is not enabled for this entity |
2 | If the request code is unsubscribed/disconnected. | 405 | Your request is unsubscribed/disconnected. Please try again with a different request code. Contact Chirp Support for more assistance, support@chirp.digital |
3 | If the request is not verified | 406 | Request status is <status>. Please verify the request and try again |
2.3.1.23. getAccountInfo
The getAccountInfo endpoint can be used to retrieve account and routing numbers for a customer's account. This is an enhanced endpoint and requires activation by Chirp. Please contact Chirp for more information.
Example success response:
Status code: 200
{ "success": true, "requestCode": "QLU0GU", "accountNumber" : [ { "account_number": "135318520965", "routing_number": "310171902", "transit_number": null, "institution_number": null, "passed_validation": true, "masked_account_number": "20965", "chirpAccountId": "ACC-2171ee40-1290-11ef-b135-150631c74239", "bankName": "Chirp Test Bank", "accountType" : "CHECKING" } ], "status" : "AVAILABLE" }
Response Field Definitions for getAccountInfo,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | requestCode | String | Request code for a request |
3 | accountNumber | Array | List of user accounts, including account number, routing number and other account-related information. |
4 | status | String | Status details of the accounts - ”AVAILABLE” - The requested data is successfully retrieved and included in the response payload, “NOT_RETURNED” - The request was successfully sent to the financial institution, but no data was returned in response., “NOT_ATTEMPTED” - No attempt was made to fetch premium data for the request., “NOT_SUPPORTED” - The financial institution does not support the requested feature, so the data cannot be retrieved. |
Description for fields under accountNumber information,
# | Field | Data Type | Description |
---|---|---|---|
1 | account_number | String | The account number of the customer |
2 | routing_number | String | The routing number for the account |
3 | transit_number | Boolean | A unique number that represents the bank branch where you opened your account |
4 | institution_number | Boolean | A three-digit number that refers to a specific bank |
5 | passed_validation | String | Returns status of the validation passed or not |
6 | masked_account_number | String | The account number of the customer. This will typically be a masked or partial account number |
7 | chirpAccountId | String | The account's unique identifier, as defined by Chirp |
8 | bankName | String | Customer’s selected bank |
9 | accountType | String | Customer’s bank account type |
Understanding error messages for getAccountInfo
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If Account Verification Feature is not enabled for the entity. | 400 | The Account Verification Feature is not enabled for this entity |
2 | If the request code is unsubscribed/disconnected. | 405 | Your request is unsubscribed/disconnected. Please try again with a different request code. Contact Chirp Support for more assistance, support@chirp.digital |
3 | If the request is not verified | 406 | Request status is <status>. Please verify the request and try again |
4 | If the request does not support the premium account information feature | 400 | The account verification feature is not available for this request |
5 | If the financial institution does not support the premium account information feature | 400 | This financial institution does not support the premium account information feature. Please contact Chirp for more information |
2.3.1.24. getAccountOwnerInfo
The getAccountOwner endpoint can be used to retrieve account owner data for a customer's account. This is an enhanced endpoint and requires activation by Chirp. Please contact Chirp for more information.
Example success response:
Status code: 200
{ "success": true, "requestCode": "QLU0GU", "accountOwnerInfo": [ { "owner_name": "John Doe", "address": "12345 South Rd", "city": "Morning View", "state": "KY", "postal_code": "41063", "country": “US”, "email": "johnDoe@gmail.com", "phone": "111-111-1111", "first_name": “John”, "last_name": “Doe” } ], "status" : "AVAILABLE" }
Response Field Definitions for getAccountOwnerInfo,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | requestCode | String | Request code for a request |
3 | accountOwnerInfo | Array | List of user accounts, including account owner-related information. |
4 | status | String | Status details of the accounts - ”AVAILABLE” - The requested data is successfully retrieved and included in the response payload, “NOT_RETURNED” - The request was successfully sent to the financial institution, but no data was returned in response., “NOT_ATTEMPTED” - No attempt was made to fetch premium data for the request., “NOT_SUPPORTED” - The financial institution does not support the requested feature, so the data cannot be retrieved. |
Description for fields under accountOwnerInfo information,
# | Field | Data Type | Description |
---|---|---|---|
1 | owner_name | String | Full name of the account owner (first and last names) |
2 | address | String | Street address of the account owner |
3 | city | String | City where the account owner resides |
4 | state | String | State or province of the account owner's location |
5 | postal_code | String | Postal or ZIP code for the account owner's address |
6 | country | String | Country where the account owner is located |
7 | String | Email address for communication with the account owner | |
8 | phone | String | Phone number of the account owner |
9 | first_name | String | First name of the account owner |
10 | last_name | String | Last name of the account owner |
Understanding error messages for getAccountOwnerInfo
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If Account Owner Feature is not enabled for this entity. | 400 | The Account Owner Feature is not enabled for this entity |
2 | If the request code is unsubscribed/disconnected. | 405 | Your request is unsubscribed/disconnected. Please try again with a different request code. Contact Chirp Support for more assistance, support@chirp.digital |
3 | If the request is not verified | 406 | Request status is <status>. Please verify the request and try again |
4 | If the request does not support the premium account owner information feature | 400 | The account owner feature is not available for this request |
5 | If the financial institution does not support the premium account owner information feature | 400 | This financial institution does not support the premium account owner information feature. Please contact Chirp for more information |
2.3.1.25. exportRequestDataAsCSV
The exportRequestDataAsCSV endpoint is used to facilitate the generation and delivery of CSV file containing request status information for the last 60 days. Upon completion, a link will be generated and sent through the configured notification channel (new notification hyperlinked will be added here), to download the exported data. The download link automatically expires after 1 hour after the notification has been sent.
Here is an example url generated - https://chirp.digital/api/getExportRequestDataApi/test_1203849125725.csv
If query param “exportByProfile” is set to true, the endpoint will generate a CSV file containing detailed request data specific to the profile for the last 60 days.
Here is an example url with the query parameter “exportByProfile” added for retrieving profile associated request data - https://chirp.digital/api/exportRequestDataAsCSV?exportByProfile=true
If query param “exportByProfile” is set to false or omitted, the CSV file will contain all request data for the entire entity for the past 60 days.
Example success response:
Status code: 200
{ "success": true, "message": "The request to export the last 60 days of request status data has been initiated. A download link will be sent to the configured EXPORT_DATA notification channel once the file is ready." }
Understanding error messages for exportRequestDataAsCSV
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If entity notification is not configured for this entity | 404 | Notification channel not configured for this entity <entity> |
2 | If notification is not configured for this profile | 404 | Notification channel not configured for this profile <profileName> |
3 | If the download link is expired | 404 | The download link is expired. Please generate a new request. |
2.3.1.26. getXactdatePredictedFundsData
The endpoint is used to get the predicted dates that funds will be available for a verified request. This feature is powered by Xactdate.
Example success response:
Status code: 200
{ "success": true, "xactdatePredictedFundsData": { "requestCode": "QLU0GU", "bestDates": [ "2023-12-18", "2023-11-29" ], "frequency": "TWICE A MONTH", "startDate": "2024-01-18", "schedulePlan": [ "2024-01-18", "2024-01-29", "2024-02-16", "2024-02-29", "2024-03-18" ], "accountId": "XXXXXXXXXXXX", "lastPayDate": "2024-01-18", "daysSinceLastPayroll": 4, "payrollAverageIncome": 555.6, "employmentStatus": "Yes", "usedTransactions": [ { "date": "2023-10-31", "transactedAt": "2023-10-31", "description": "Dividend (GT18)DIVIDEND", "category": "Dividend & Cap Gains", "status": "POSTED", "amount": 0.02 }, { "date": "2023-11-30", "transactedAt": "2023-11-30", "description": "Dividend (GT18)DIVIDEND", "category": "Dividend & Cap Gains", "status": "POSTED", "amount": 0.02 }, { "date": "2023-12-31", "transactedAt": "2023-12-31", "description": "Dividend (GT18)DIVIDEND", "category": "Dividend & Cap Gains", "status": "POSTED", "amount": 0.01 }, { "date": "2024-01-31", "transactedAt": "2024-01-31", "description": "Dividend (GT18)DIVIDEND", "category": "Dividend & Cap Gains", "status": "POSTED", "amount": 0.01 } ], "employmentStatusDetail": { "error": "No payroll transactions in the last 30 days." }, "incomeByMonth": { "2023": { "October": 0.02, "November": 0.02, "December": 0.01 }, "2024": { "January": 0.01 } } } }
Response Field Definitions for getXactdatePredictedFundsData,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | requestCode | String | Request code for a request |
3 | bestDates | Array of strings | Denoted best dates when the customer has funds based on the frequency |
4 | frequency | String | Denotes when the customer has funds. Eg - Monthly, Bi-Weekly, Weekly or Twice a month. |
5 | startDate | String | Possible first future fund availability date |
6 | SchedulePlans | Array of strings | Possible future fund availability dates |
7 | accountId | String | The identifier for the account associated |
8 | lastPayDate | String | The most recent payroll transaction date |
9 | daysSinceLastPayroll | Integer | Number of days since the last payroll transaction until now |
10 | payrollAverageIncome | Integer | Average income amount from all of used transactions |
11 | employmentStatus | String | Represents predicted current employment status |
12 | usedTransactions | Array | List of the transactions which were used to compute frequency. |
13 | employmentStatusDetail | Object | Extra data about employment status. |
14 | incomeByMonth | Object | Income aggregated per month and year, available months will depend on the date range of used transactions. |
Understanding error messages for getXactdatePredictedFundsData
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the integration settings is not enabled for the entity | 404 | Xactdate is not configured for this entity |
2 | If no data is available | 404 | Xactdate data is not available please try again later |
2.3.1.27. enableXactdatePredictedFundsData
The endpoint is used to enable fund availability prediction for ON_DEMAND type requests. The url also takes a query param as active to enable or disable the payment plan feature for the request. The active query param defaults to true if not passed. The fund availability prediction feature is powered by Xactdate
Payload Field Definition for enableXactdatePredictedFundsData,
# | Field | Data Type | Description |
---|---|---|---|
1 | frequency* | Array of strings | Preference for calculating payment dates. Choices: E (Monthly), B (Bi-Weekly), W (Weekly) and F(Twice a month). |
2 | paymentDates* | Integer | Number of future payment days returned based on the frequency detected |
3 | maximumDissimilarity* | Integer | Maximum number of days of tolerance a transaction can drift from a periodic frequency |
Sample Request Payload
{ "frequency" : ["E", "B", "W", "F"], "paymentDates" : 8, "maximumDissimilarity" : 3 }
Example success response:
Status code: 200
{ "success": true, "message": "Xactdate prediction has been successfully disabled for this request" }
Response Field Definitions for enableXactdatePredictedFundsData,
# | Field Name | Description |
---|---|---|
1 | success | Response result of the request |
2 | message | Success message |
Understanding error messages for enableXactdatePredictedFundsData
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the integration settings is not enabled for the entity | 404 | Xactdate is not configured for this entity |
2 | If the frequency field in the body is invalid | 400 | Please check the frequency and try again |
3 | If the paymentDates field in the body is invalid | 400 | Please check the payment dates and try again |
4 | If the maximumDissimilarity field in the body is invalid | 400 | Please check the maximun dissimilarity and try again |
2.3.1.28. genAuthTokenForChirpLink
The genAuthTokenForChirpLink endpoint should be used for generating a new one-time token associated with a request code for supplying and loading the ChirpLink™ widget.
Example success response:
Status code: 200
{ "success": true, "token": "y5yh45h4w5h45h4j4w6j4wj4htrhw6u65h6j56h5y", "requestCode": "QLU0GU", "validUpto": "8/10/2021, 10:33 PM" }
Response Field Definitions for genAuthTokenForChirpLink,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response result of the request |
2 | token | String | Token generated for initiating a customer verification in entity’s integration |
3 | requestCode | String | The request code for which the token is valid |
4 | validUpto | String | The expiration time until the generated token is valid. Timezone is CST |
2.3.1.29. requestXtraHistory
The requestXtraHistory endpoint is used to request Xtra History for verified requests. The request will attempt to update an already verified requests with up to 24 months of transaction history. Not all financial institutions will support this request. This is an enhanced endpoint that supports OAuth bank requests and requires activation by Chirp. Please contact Chirp for more information.
Example success response:
Status code: 200
{ "success": true, "message": "Xtra History™ has been successfully requested for this request" }
Response Field Definitions for requestXtraHistory,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | message | String | Success message |
3 | status | String | Status details of the transactions - “NOT_ATTEMPTED” - No attempt was made to fetch premium data for the request., “NOT_SUPPORTED” - The financial institution does not support the requested feature, so the data cannot be retrieved. |
Understanding error messages for requestXtraHistory
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If Xtra History is not enabled for the entity | 400 | Xtra History is not enabled for this entity. Please contact Chirp for more information. |
2 | If the financial institution does not support Xtra History | 400 | The financial institution does not support Xtra History. Please contact Chirp for more information. |
3 | If a rejected request is passed | 406 | Request status is rejected. The request must be verified. Please contact Chirp for more information. |
4 | If a expired request is passed | 406 | Request status is expired. The request must be verified. Please contact Chirp for more information. |
5 | If a unverfied request is passed | 406 | Request status is unverfied. The request must be verified. Please contact Chirp for more information. |
6 | If a attempted request is passed | 406 | Request status is attempted. The request must be verified. Please contact Chirp for more information. |
7 | If an already enabled Xtra History request is passed | 405 | Xtra History Feature is already enabled for this request code |
8 | If the request code is unsubscribed/disconnected. | 405 | Your request is unsubscribed/disconnected. Please try again with a different request code. Contact Chirp Support for more assistance, support@chirp.digital |
9 | If the request does not support the Xtra History feature | 405 | The Xtra History™ feature is not available for this request |
10 | If the OAuth bank request is passed | 400 | The Xtra History™ feature is not available for this request |
2.3.1.30. getCustomRequestDetails
This endpoint provides a custom response per the configured response template in the Chirp Portal. This endpoint accepts four parameters:
- template: If the template parameter is empty or not provided, the request will return the Chirp “Default” template as configured in the Chirp Portal (sample listed below).
- account: If the accountNumber or chirpAccountId is omitted or not found, the response will default to returning all accounts.
- chirpAccountId: If the chirpAccountId or accountNumber is omitted or not found, the response will default to returning all accounts.
- numberOfDays: Specifies the total number of days for which transactions should be retrieved. This parameter filters the transactions based on the specified number of days.
Click here to review the Portal Documentation for adding and maintaining templates.
Note: This endpoint returns running balance for transactions only if an account number is passed as part of request. Otherwise, this response will not have the running balance.
Example default response:
Status code: 200
{ requestCode: "QLU0GU", success: true, addedOn: "2024-04-10T04:58:30.040Z", modifiedOn: "2024-04-10T07:22:08.585Z", lastAggregatedAt: "2024-04-10T07:22:08.585Z", connectionStatus: "Subscribed", institutionName: "Chirp Test Bank", accountInfoStatus: "AVAILABLE", accountOwnerInfoStatus: "NOT_SUPPORTED", "customerInfo": { "firstName": "John", "lastName": "Doe", "email": "chirpdemo@chirp.digital", "phoneNumber": "+11111111111", "customerEnteredAccountNumber": "123456", "customerEnteredRoutingNumber": "0987654" }, accounts: [ { _id: "66163e1c311ed718904b6ed0", account_number: "708191771", apr: null, apy: null, available_balance: 1000, available_credit: null, balance: 1000, cash_balance: null, cash_surrender_value: null, credit_limit: null, currency_code: null, day_payment_is_due: null, death_benefit: null, holdings_value: null, interest_rate: null, institution_code: "chirpbank", insured_name: null, is_closed: false, last_payment: null, loan_amount: null, matures_on: null, minimum_balance: null, minimum_payment: null, name: "Checking", original_balance: null, pay_out_amount: null, payoff_balance: null, premium_amount: null, routing_number: "889223786", started_on: null, total_account_value: null, subtype: null, type: "CHECKING", created_at: "2023-06-30T12:14:11Z", last_payment_at: null, payment_due_at: null, updated_at: "2023-09-21T01:12:26Z", account_id: "act-223434333", requestCode: " QLU0GU", entityId: "5ff1e1d0d4234b02da76ebfb", profileId: "5ff1e1d0d4234b02da76ebfc", chirpAccountId: "ACC-2171ee40-1290-11ef-b135-150631c74239", addedOn: "2024-04-10T07:22:04.856Z", modifiedOn: "2024-04-10T07:22:04.856Z", __v: 0, customerAccountMatchStatus: "No Match", customerRoutingNumberMatchStatus: "No Match" }, ], transactions: [ { category: "Personal Care", created_at: "2024-04-10T07:22:04.761Z", date: "2024-04-10", posted_at: "2024-04-10T07:22:04.760Z", status: "POSTED", top_level_category: "Personal Care", transacted_at: "2024-04-10T07:22:04.760Z", type: "DEBIT", updated_at: "2024-04-10T07:22:04.761Z", account_id: "act-223434333", amount: 11.08, check_number_string: null, currency_code: "USD", description: "Bath & Body Works", id: "transfer-c44348d1-a79b-476b-8da5-abd175ea805e", is_bill_pay: false, is_direct_deposit: false, is_expense: true, is_fee: false, is_income: false, is_international: null, is_overdraft_fee: false, is_payroll_advance: false, is_recurring: null, is_subscription: false, latitude: null, localized_description: null, localized_memo: null, longitude: null, member_is_managed_by_user: true, memo: null, merchant_category_code: null, original_description: "Bath and Body Works", categoryCode: "PRC", parentCategoryCode: "PRC", running_balance: 1000, chirpAccountId: "ACC-2171ee40-1290-11ef-b135-150631c74239", chirpTransactionId: "TRN-21721550-1290-11ef-b135-150631c74239" }, ], transactionAnalysisSummaries: [ { category: "PRC", total: 6, amount: "$266.01", recentTransactionAmount: "$11.08", recentTransactionCount: 1, categoryName: "Personal Care", transaction: [ { category: "Personal Care", created_at: "2024-04-10T07:22:04.761Z", date: "2024-04-10", posted_at: "2024-04-10T07:22:04.760Z", status: "POSTED", top_level_category: "Personal Care", transacted_at: "2024-04-10T07:22:04.760Z", type: "DEBIT", updated_at: "2024-04-10T07:22:04.761Z", account_id: "act-223434333", amount: 11.08, check_number_string: null, currency_code: "USD", description: "Bath & Body Works", id: "transfer-c44348d1-a79b-476b-8da5-abd175ea805e", is_bill_pay: false, is_direct_deposit: false, is_expense: true, is_fee: false, is_income: false, is_international: null, is_overdraft_fee: false, is_payroll_advance: false, is_recurring: null, is_subscription: false, latitude: null, localized_description: null, localized_memo: null, longitude: null, member_is_managed_by_user: true, memo: null, merchant_category_code: null, original_description: "Bath and Body Works", categoryCode: "PRC", parentCategoryCode: "PRC", running_balance: 1000, chirpAccountId: "ACC-2171ee40-1290-11ef-b135-150631c74239", chirpTransactionId: "TRN-21721550-1290-11ef-b135-150631c74239" }, ], }, ], accountExpenses: [ { amount: "$266.01", category: "Personal Care", percent: "1.59", }, ], totalTransactions: [ { accountNumer: "708191771", totalTransactions: 168, numberOfDays: 460, }, ], debitCardEnrichment: [ { lastFourDebitCardNumber: "1234", autoflaggeddebit: true, debitCardIndicatorMessage: "12 out of 1000 transaction matches", cardMateches: true, debitCardIndicatorStatus: "High" }, ], accountInfo: [ { "account_number": "135318520965", "routing_number": "310171902", "transit_number": null, "institution_number": null, "passed_validation": true, "masked_account_number": "20965", "chirpAccountId": "ACC-2171ee40-1290-11ef-b135-150631c74239", "bankName": "Chirp Test Bank" } ], accountOwnerInfo: [ { "owner_name": "John Doe", "address": "12345 South Rd", "city": "Morning View", "state": "KY", "postal_code": "41063", "country": “US”, "email": "johnDoe@gmail.com", "phone": "111-111-1111", "first_name": “John”, "last_name": “Doe” } ] };
Below is the table explaining the response returned from getCustomRequestDetails,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | requestCode | String | Request code of the respective request |
2 | success | Boolean | Response result of the request |
3 | addedOn | String | Timestamp of request created |
4 | modifiedOn | String | Timestamp of request modified |
5 | lastAggregatedAt | Boolean | Timestamp when the customer data has been updated |
6 | verifiedOn | Boolean | Timestamp when request is verified |
7 | planType | String | Plan type of the request code - SUBSCRIPTION/PAYG/FLEX |
8 | subtype | String | Subtype of the request code - SUBSCRIPTION/PAYG |
9 | connectionStatus | String | Connection status of the request. This field returns Subscribed/Unsubscribed or Connected/Disconnected or NA as a value based on the plan type |
10 | institutionName | String | The institution name for the account(s) associated |
11 | customerInfo | Object | Customer Details |
12 | accounts | Array | All the accounts that are linked with the verified bank account |
13 | transactions | Array | Transaction data of the verified account |
14 | transactionAnalysisSummaries | Array | Transaction data grouped with transaction type categories |
15 | accountExpenses | Array | Expense breakdown based on transaction data |
16 | totalTransactions | Array | Transaction count and number of days for each account |
17 | debitCardEnrichment | Array | Debit card enrichment match details |
18 | accountInfoStatus | String | Status details of the accounts - ”AVAILABLE” - The requested data is successfully retrieved, “NOT_RETURNED” - The request was successfully sent to the financial institution, but no data was returned in response., “NOT_ATTEMPTED” - No attempt was made to fetch premium data for the request., “NOT_SUPPORTED” - The financial institution does not support the requested feature, so the data cannot be retrieved, “NA” - Account Info Feature is not enabled. |
19 | accountOwnerInfoStatus | String | Status details of the account owner - ”AVAILABLE” - The requested data is successfully retrieved, “NOT_RETURNED” - The request was successfully sent to the financial institution, but no data was returned in response., “NOT_ATTEMPTED” - No attempt was made to fetch premium data for the request., “NOT_SUPPORTED” - The financial institution does not support the requested feature, so the data cannot be retrieved, “NA” - Account Owner Feature is not enabled. |
20 | accountInfo | Array | List of user accounts, including account number, routing number and other account-related information |
21 | accountOwnerInfo | Array | List of user accounts, including account owner-related information |
Description for fields under consumerInfo information,
# | Field | Data Type | Description |
---|---|---|---|
1 | firstName | String | First name of the consumer |
2 | lastName | String | Last name of the consumer |
3 | String | Email address of the consumer | |
4 | phoneNumber | String | Phone number of the consumer |
5 | customerEnteredAccountNumber | String | Customer’s account number entered into Chirp as part of creating the request. Could have been entered in the Portal or sent via API by the integration partner |
6 | customerEnteredRoutingNumber | String | Customer’s routing number entered into Chirp as part of creating the request. Could have been entered in the Portal or sent via API by the integration partner |
Description for fields under accounts information,
# | Field | Data Type | Description |
---|---|---|---|
1 | account_number | string | The account number. This will typically be a masked or partial account number. |
2 | apr | Decimal | Annual Percentage Rate. Max length is 10,6. |
3 | apy | Decimal | Annual Percentage Yield. Max length is 10,6. |
4 | available_balance | Decimal | The balance currently available in an account. Max length is 14,2. |
5 | available_credit | Decimal | The currently available credit balance of an account. This field is for accounts with types CREDIT CARD and LINE OF CREDIT. |
6 | balance | Decimal | An account's current balance. Max length is 14,2. |
7 | cash_balance | Decimal | The cash balance of the account. Max length is 14,2. |
8 | created_at | String | The date and time the account was created. |
9 | credit_limit | Decimal | The credit limit for the account. Max length is 10,2. |
10 | currency_code | String | The three-character ISO 4217 currency code, e.g. USD. |
11 | holdings_value | Decimal | The value of the holdings associated with the account. |
12 | institution_code | String | Unique identifier for the financial institution which holds the account. |
13 | interest_rate | Decimal | Interest rate. Max length is 10,6. |
14 | is_closed | Boolean | If an account is closed, this field will be true. Otherwise, this field will be false. |
15 | type | String | The main type of an account, e.g., INVESTMENT, PREPAID, or SAVINGS. |
16 | updated_at | String | The date and time at which the account was last updated. |
17 | routing_number | String | The routing number for the account. |
18 | insured_name | String | The date and time the account was created |
19 | cash_surrender_value | Decimal | Money paid to the policy holder or annuity holder in the event the policy is voluntarily terminated before it matures, or the insured event occurs |
20 | day_payment_is_due | String | The day of the month the payment is due. e.g 14 |
21 | death_benefit | Integer | The amount paid to the beneficiary of the account upon death of the account owner |
22 | last_payment | Decimal | The amount of the recent payment on the account |
23 | loan_amount | Decimal | The amount of the loan associated with the account |
24 | matures_on | String | The date on which the account matures |
25 | minimum_balance | Decimal | The minimum balance of the account |
26 | minimum_payment | Decimal | The minimum payment required for an account. This can apply to any debt account |
27 | name | String | The human-readable name for the account |
28 | original_balance | Decimal | The original balance of the account. This will always be positive |
29 | pay_out_amount | String | The amount paid out to the insured person or beneficiary under the conditions of the insurance policy |
30 | payoff_balance | Decimal | The payoff balance for a debt account. This will normally be a positive number |
31 | premium_amount | Decimal | The insurance policy's premium amount |
32 | started_on | String | The date on which a debt account was started |
33 | total_account_value | Decimal | The total combining both long and short positions, the sweep account and/or cash balance, and any margin debt linked to a specific account. This figure encompasses the aggregate market value of all positions within the account, offset by any debit balance and the value of short options positions that are profitable. This cumulative value can be negative and should not be misconstrued as an account balance |
34 | subtype | String | The account's subtype, e.g., PLAN_401_K, MONEY_MARKET, or HOME_EQUITY |
35 | last_payment_at | String | The date and time of the most recent payment on the account |
36 | payment_due_at | String | The date and time at which the next payment is due on the account |
37 | account_id | String | The unique identifier for the account |
38 | requestCode | String | Unique code assigned for a customer request |
39 | entityId | String | Unique identifier for an entity |
40 | profileId | String | Unique identifier for a profile associated with an entity |
41 | addedOn | String | The timestamp when the account data for the customer is added in Chirp |
42 | modifiedOn | String | The timestamp when the account data for the customer is last modified in Chirp |
43 | customerAccountMatchStatus | String | Will return one of the following options "Full Match" – customer entered and financial returned match fully. "Partial Match" - customer entered and financial returned match partially. "No Match" - customer entered and financial returned do not match at all. "NA" – customer information was not entered. |
44 | customerRoutingNumberMatchStatus | String | Will return one of the following options "Full Match" – customer entered and financial returned match fully. "Partial Match" - customer entered and financial returned match partially. "No Match" - customer entered and financial returned do not match at all. "NA" – customer information was not entered. |
Description for additional or optional fields under accounts,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | chirpAccountId | String | The account's unique identifier, as defined by Chirp |
Description for fields under transactions information,
# | Field | Data Type | Description |
---|---|---|---|
1 | amount | Decimal | The monetary amount of the transaction. Max length is 10,2. |
2 | category | String | The category of the transaction. |
3 | check_number | Integer | DEPRECATED. Use check_number_string instead. |
4 | check_number_string | String | The check number for the transaction. |
5 | created_at | String | The date and time the transaction was stored. |
6 | currency_code | String | The three-character ISO 4217 currency code, e.g. USD. |
7 | date | String | The date the transaction was created. |
8 | description | String | A human-readable version of the original_description field described below, e.g., "Sam's Club," "Johnny's Tavern." |
9 | is_bill_pay | Boolean | If the transaction is a bill pay, this field will be true. Otherwise, this field will be false. |
10 | is_direct_deposit | Boolean | If the transaction is a direct deposit, this field will be true. Otherwise, this field will be false. |
11 | is_expense | Boolean | If the transaction is an expense, this field will be true. Otherwise, this field will be false. |
12 | is_fee | Boolean | If the transaction is a fee, this field will be true. Otherwise, this field will be false. |
13 | is_income | Boolean | If the transaction is income, this field will be true. Otherwise, this field will be false. |
14 | is_international | Boolean | If the transaction is international as defined by the data provider, this field will be true. If the data provider determines it is not international, then it will be false. It will be null if the data provider does not have this information. |
15 | is_overdraft_fee | Boolean | If the transaction is an overdraft fee, this field will be true. Otherwise, this field will be false. |
16 | is_payroll_advance | Boolean | If the transaction is a payroll advance fee, this field will be true. Otherwise, this field will be false. |
17 | latitude | Decimal | The latitude of the location where the transaction occurred. The number is a signed decimal. |
18 | longitude | Decimal | The longitude of the location where the transaction occurred. The number is a signed decimal. |
19 | memo | String | This field contains additional descriptive information about the transaction. |
20 | merchant_category_code | Integer | The ISO 18245 category code for the transaction. |
21 | original_description | String | The original description of the transaction as provided by our data feed. See description above for more information. |
22 | posted_at | String | The date and time the transaction was posted. |
23 | status | String | The status of the transaction, i.e., POSTED or PENDING. |
24 | top_level_category | String | The parent category that this transaction's category is assigned to. |
25 | transacted_at | String | The date and time the transaction took place. |
26 | type | String | The type of transaction, i.e., CREDIT or DEBIT. |
27 | updated_at | String | The date and time the transaction was updated. |
28 | is_recurring | Boolean | Recurring payment or transaction |
29 | account_id | String | The identifier for the account associated with the transaction |
30 | id | String | The unique partner-defined identifier for the transaction. This can only be set for partner-managed transactions. It should be ignored for user-managed transactions, even in occasional cases where it may return with a value |
31 | is_subscription | Boolean | If transaction represents a payment for a subscription service such as Netflix or Audible |
32 | localized_description | String | A human-readable description of the transaction, provided in a local language |
33 | localized_memo | String | Additional descriptive information about the transaction, provided in a local language |
34 | user_id | String | The unique identifier for the user associated with the transaction |
35 | categoryCode | String | The category code of the transaction |
36 | parentCategoryCode | String | The parent category code of the transaction |
37 | member_is_managed_by_user | String | Whether the member is managed by user or not |
38 | running_balance | String | Amount of funds in an account after each transaction has been processed, providing a real-time snapshot of the account's current balance |
Description for additional or optional fields under transactions,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | chirpAccountId | String | The account's unique identifier, as defined by Chirp |
2 | chirpTransactionId | String | The transaction's unique identifier, as defined by Chirp |
Description for fields under transactionAnalysisSummaries information,
# | Field | Data Type | Description |
---|---|---|---|
1 | category | String | A label identifying the type of transaction, for instance, "FEE" |
2 | total | Decimal | The total number of transactions within this category |
3 | amount | String | The combined total amount for all transactions in this category, for instance, "$32.00" |
4 | recentTransactionAmount | String | The amount of the most recent transaction in this category, for instance, "$2.00" |
5 | recentTransactionCount | Decimal | The number of recent transactions, for instance, 1 |
6 | categoryName | String | The more descriptive name of the category, such as "Fees & Charges" |
7 | transaction | Array | Transactions associated with the category |
Description for fields under accountExpenses information,
# | Field | Data Type | Description |
---|---|---|---|
1 | amount | String | The amount of expenses incurred |
2 | category | String | The category of expenses |
3 | percent | String | The percentage of expenses relative to total expenses |
Description for fields under totalTransactions information,
# | Field | Data Type | Description |
---|---|---|---|
1 | accountNumber | String | The account number. This will typically be a masked or partial account number |
2 | totalTransaction | String | Total number of transactions returned |
3 | numberOfDays | String | Total number of days of the transactions returned since inception till date |
Description for fields under debitCardEnrichment information,
# | Field | Data Type | Description |
---|---|---|---|
1 | lastFourDebitCardNumber | String | Last four digits of the customer's debit card |
2 | debitCardIndicatorMessage | String | A detailed message with match count and enrichment indicator definition |
3 | cardMatches | Boolean | If the provided last 4 digits of debit card number matches with the flagged transactions |
4 | autoflaggeddebit | Boolean | Auto flagged card and associated transactions by the system |
5 | debitCardIndicatorStatus | String | Denotes the enrichment of debit card being connected |
Description for fields under accountInfo information,
# | Field | Data Type | Description |
---|---|---|---|
1 | account_number | String | The account number of the customer |
2 | routing_number | String | The routing number for the account |
3 | transit_number | Boolean | A unique number that represents the bank branch where you opened your account |
4 | institution_number | Boolean | A three-digit number that refers to a specific bank |
5 | passed_validation | String | Returns status of the validation passed or not |
6 | masked_account_number | String | The account number of the customer. This will typically be a masked or partial account number |
7 | chirpAccountId | String | The account's unique identifier, as defined by Chirp |
8 | bankName | String | Customer’s selected bank |
Description for fields under accountOwnerInfo information,
# | Field | Data Type | Description |
---|---|---|---|
1 | owner_name | String | Full name of the account owner (first and last names) |
2 | address | String | Street address of the account owner |
3 | city | String | City where the account owner resides |
4 | state | String | State or province of the account owner's location |
5 | postal_code | String | Postal or ZIP code for the account owner's address |
6 | country | String | Country where the account owner is located |
7 | String | Email address for communication with the account owner | |
8 | phone | String | Phone number of the account owner |
9 | first_name | String | First name of the account owner |
10 | last_name | String | Last name of the account owner |
Understanding error messages for getCustomRequestDetails
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If requesting details for an expired request | 406 | Request status is expired. Please try again with a verified request code |
2 | If requesting details for a rejected request | 406 | Request status is rejected. Please try again with a verified request code |
3 | If requesting details from a request code that has not been verified | 406 | Request status is unverified. Please verify the request and try again |
4 | If the template Name is invalid or incorrect | 404 | Template <template-name> not found or is not associated with this Entity <entity-name> |
5 | If the account number passed is invalid or incorrect | 400 | Account number passed is invalid. Please try again with a valid account number |
6 | If the chirp account id passed is invalid or incorrect | 400 | Chirp account id passed is invalid. Please try again with a valid chirp account id |
2.3.1.31. getRequestAccountDetails
This endpoint is used to retrieve all the account information for a verified request. The endpoint requires the request code to be passed. The request must be in a verified status.
Example success response:
Status code: 200
{ "success": true, "requestCode": "QLU0GU", "accounts": [{ "account_number": "708191771", "apr": 334, "apy": 158, "available_balance": 1000, "available_credit": 333, "balance": 1000, "cash_balance": 544, "created_at": "2023-06-30T12:14:11Z", "credit_limit": 651, "currency_code": "USD", "guid": "ACT-79ecc14f-ac33-45ab-b596-1fa997ff11a8", "holdings_value": 445.45, "institution_code": "chirpbank", "interest_rate": 170.4, "is_closed": false, "member_guid": "MBR-b31f9571-0842-11ef-9433-a5944bf5328f", "type": "CHECKING", "updated_at": "2023-09-21T01:12:26Z", "user_guid": "USR-b31f9570-0842-11ef-9433-a5944bf5328f", "routing_number": "889223786", "insured_name": "John Doe", "cash_surrender_value": 544, "day_payment_is_due": "124", "death_benefit": 732, "last_payment": 352, "loan_amount": 651, "matures_on": "2023-11-10", "minimum_balance": 252, "minimum_payment": 518, "name": "Checking", "original_balance": 981, "pay_out_amount": "688", "payoff_balance": 87, "premium_amount": 334, "started_on": "2023-10-11", "total_account_value": 961.21, "subtype": "NONE", "last_payment_at": "2023-11-13T05:03:51.575Z", "payment_due_at": "2023-11-13T05:03:51.575Z", "account_id": "act-223434333", "requestCode": "QLU0GU", "entityId": "5ff832f6711af0292e7828f9", "profileId": "5ff832f6711af0292e7828fa", "chirpAccountId": "ACC-2171ee40-1290-11ef-b135-150631c74239", "addedOn": "2024-05-02T05:13:32.029Z", "modifiedOn": "2024-05-02T05:13:32.029Z" }], }
Below is the table explaining the response returned from getRequestAccountDetails,
# | Field Name | Description |
---|---|---|
1 | requestCode | Request code of the respective request |
2 | success | Response result of the request |
3 | accounts | All the accounts that are linked with the verified bank account |
Description for fields under accounts information,
# | Field | Data Type | Description |
---|---|---|---|
1 | account_number | string | The account number. This will typically be a masked or partial account number. |
2 | apr | Decimal | Annual Percentage Rate. Max length is 10,6. |
3 | apy | Decimal | Annual Percentage Yield. Max length is 10,6. |
4 | available_balance | Decimal | The balance currently available in an account. Max length is 14,2. |
5 | available_credit | Decimal | The currently available credit balance of an account. This field is for accounts with types CREDIT CARD and LINE OF CREDIT. |
6 | balance | Decimal | An account's current balance. Max length is 14,2. |
7 | cash_balance | Decimal | The cash balance of the account. Max length is 14,2. |
8 | created_at | String | The date and time the account was created. |
9 | credit_limit | Decimal | The credit limit for the account. Max length is 10,2. |
10 | currency_code | String | The three-character ISO 4217 currency code, e.g. USD. |
11 | holdings_value | Decimal | The value of the holdings associated with the account. |
12 | institution_code | String | Unique identifier for the financial institution which holds the account. |
13 | interest_rate | Decimal | Interest rate. Max length is 10,6. |
14 | is_closed | Boolean | If an account is closed, this field will be true. Otherwise, this field will be false. |
15 | type | String | The main type of an account, e.g., INVESTMENT, PREPAID, or SAVINGS. |
16 | updated_at | String | The date and time at which the account was last updated. |
17 | routing_number | String | The routing number for the account. |
18 | insured_name | String | The date and time the account was created |
19 | cash_surrender_value | Decimal | Money paid to the policy holder or annuity holder in the event the policy is voluntarily terminated before it matures, or the insured event occurs |
20 | day_payment_is_due | String | The day of the month the payment is due. e.g 14 |
21 | death_benefit | Integer | The amount paid to the beneficiary of the account upon death of the account owner |
22 | last_payment | Decimal | The amount of the recent payment on the account |
23 | loan_amount | Decimal | The amount of the loan associated with the account |
24 | matures_on | String | The date on which the account matures |
25 | minimum_balance | Decimal | The minimum balance of the account |
26 | minimum_payment | Decimal | The minimum payment required for an account. This can apply to any debt account |
27 | name | String | The human-readable name for the account |
28 | original_balance | Decimal | The original balance of the account. This will always be positive |
29 | pay_out_amount | String | The amount paid out to the insured person or beneficiary under the conditions of the insurance policy |
30 | payoff_balance | Decimal | The payoff balance for a debt account. This will normally be a positive number |
31 | premium_amount | Decimal | The insurance policy's premium amount |
32 | started_on | String | The date on which a debt account was started |
33 | total_account_value | Decimal | The total combining both long and short positions, the sweep account and/or cash balance, and any margin debt linked to a specific account. This figure encompasses the aggregate market value of all positions within the account, offset by any debit balance and the value of short options positions that are profitable. This cumulative value can be negative and should not be misconstrued as an account balance |
34 | subtype | String | The account's subtype, e.g., PLAN_401_K, MONEY_MARKET, or HOME_EQUITY |
35 | last_payment_at | String | The date and time of the most recent payment on the account |
36 | payment_due_at | String | The date and time at which the next payment is due on the account |
37 | account_id | String | The unique identifier for the account |
38 | requestCode | String | Unique code assigned for a customer request |
39 | entityId | String | Unique identifier for an entity |
40 | profileId | String | Unique identifier for a profile associated with an entity |
41 | addedOn | String | The timestamp when the account data for the customer is added in Chirp |
42 | modifiedOn | String | The timestamp when the account data for the customer is last modified in Chirp |
43 | guid | String | Unique identifier for the account |
44 | member_guid | String | Unique identifier for the member to which this account belongs |
45 | user_guid | String | A unique identifier for the user to which the account belongs |
Description for additional or optional fields under accounts,
# | Field Name | Data Type | Description |
---|---|---|---|
1 | chirpAccountId | String | The account's unique identifier, as defined by Chirp |
Understanding error messages for getRequestAccountDetails
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If requesting details for an expired request | 406 | Request status is expired. Please try again with a verified request code |
2 | If requesting details for a rejected request | 406 | Request status is rejected. Please try again with a verified request code |
3 | If requesting details from a request code that has not been verified | 406 | Request status is unverified/Attempted. Please verify the request and try again |
2.3.1.32. updateCustomerProduct
This endpoint allows FLEX plan entities to switch between subtype for their customers
Example success response:
Status code: 200
{ "success": true, "message": "Requested subtype has been successfully updated from PAYG to Subscription" }
Below is the table explaining the response returned from updateCustomerProduct,
# | Field Name | Description |
---|---|---|
1 | success | Response result of the request |
3 | message | Success description of the request subtype change |
Understanding error messages for updateCustomerProduct
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the entity does not have the product plan type FLEX | 400 | This entity <entityName> does not have the flex plan type for the product Subtype is invalid. Please check the subtype |
2 | If the subtype entered is other than PAYG or SUBSCRIPTION | 400 | Subtype is invalid. Please check the subtype |
3 | If the subtype is already in the same plan type | 409 | Subtype is already in <productType> plan type |
2.3.1.33. enableFraudScoreByVeritrust
The endpoint is used to enable fraud score for ON_DEMAND type requests. The url also takes a query param as active to enable or disable the fraud scoring feature for the request. The active query param defaults to true if not passed.
Example success response:
Status code: 200
{ "success": true, "message": "Fraud Score is enabled for this request successfully", }
Response Field Definitions for enableFraudScoreByVeritrust,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | message | String | Success message |
Understanding error messages for enableFraudScoreByVeritrust
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the integration settings is not enabled for the entity | 400 | Fraud Score is not enabled for this entity |
2.3.1.34. getFraudScoreByVeritrust
The getFraudScoreByVeritrust endpoint is used to retrieve fraud score information for a verified request. The fraud score data and information is provided by VeriTrust.
Example success response:
Status code: 200
{ "success": true, "fraudScoreInfo": { "requestCode": "QLU0GU", "leadId": "ABCDEF123456", "pulse": "33", "insight": "22", "intent": "16", "acuity": "43", "status": "S", "error": "erroInfo" } }
Response Field Definitions for getFraudScoreByVeritrust,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | requestCode | String | Request code for a request |
3 | leadId | String | The unique identifier for the lead |
4 | pulse | String | The calculated pulse score for the customer |
5 | insight | String | The calculated insight score for the custome |
6 | intent | String | The calculated intent score for the customer |
7 | acuity | String | The calculated acuity score for the customer |
8 | status | String | Status of the fraud score ("S" for success, "E" for error) |
9 | error | String | Error message (if any) |
Understanding error messages for getFraudScoreByVeritrust
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If the fraud score is not found for the request | 404 | Fraud score info not found for this request |
2.3.1.35. getBankLogoByRequestCode
The getBankLogoByRequestCode endpoint serves bank logos associated with the customer in either "small" or "medium" sizes. The URL includes an optional query parameter, size, to specify the desired logo size. If the size is provided, the corresponding logo image is served directly; otherwise, both the small and medium versions are included in the response. If the customer has not yet selected a bank, Chirp returns a successful response with success: true, status code 200, and the message: "The customer has not selected a financial institution for the verification process yet."
Example success response:
Status code: 200
{ "success": true, "bankSelected" : true, "logoVersion": { "small": "https://chirp.digital/api/bankLogo/chirpbank_small.png", "medium": "https://chirp.digital/api/bankLogo/chirpbank_medium.png", } }
Response Field Definitions for getBankLogoByRequestCode,
# | Field | Data Type | Description |
---|---|---|---|
1 | success | Boolean | Response status of the request |
2 | bankSelected | Boolean | Indicates if the customer has selected a financial institution to verify or not |
3 | logoVersion | Object | Bank logo version uri |
Understanding error messages for getBankLogoByRequestCode
# | Scenario | Error Code | Error Message |
---|---|---|---|
1 | If size passed is invalid | 400 | Please try again with a valid size. |
3. Widget Implementations
There are three Chirp Widgets that can be utilized to assist customers with the integration of Chirp into their business model. By using the widgets, customers can significantly reduce the level of effort and time it takes to implement Chirp.
The widgets can be implemented together or separately, depending on your unique business model and requirements.
3.1. Configure the Success/Failure Redirections
Part of the Profile configuration for use with Chirp widgets are the success and failure redirect URLs. Be sure to configure the URLs per your business model and process flow. When an end-customer attempts to verify a request, these URLs are sent to the web page where the IFRAME widget is integrated through the PostMessage API with the request code appended. The webpage can then redirect the end-customer based on the success or failure of the verification attempt. No redirection will occur if the redirect URLs are empty.

The following section explains how to implement the various Chirp Widgets for requesting and viewing successful Instant Financial Verification (IFV) results from the customer.
3.2. Request Widget
The Chirp Request Widget can be embedded as an iFrame or loaded into a webpage for requesting financial verification from a customer.
The basic workflow required for the Request Widget:
- Create a request code via the Chirp API createRequest endpoint
- Create and load the request widget the request code returned from step 1.
Here are the three possible workflows (assuming all required elements are provided to the widget and no other error conditions occur):
- Bank name is not passed with createRequest:
- A new verification request will be generated, and the widget will present the bank search screen to the customer.
- Bank name is passed with createRequest, but the bank is not found:
- The API will respond with a “bank not found” error message. At this point, the request can be abandoned or re-sent with or without the bank name.
- Bank name is passed with createRequest, and the bank name is found:
- The API will create the request with the bank name pre-selected. Although the bank is pre-filled, if the Entity Profile has enabled the option to "Display Institution search," the customer will be able to search for a different bank and change the bank in the widget presented to them.
3.2.1. Request Widget
A custom request widget than can be loaded in a web page and can be branded to your specifications for interacting with the customer to obtain financial verification.
For instance, if yourloancompany.com is integrated, then “Your Loan Company” can create a web page for loading the request widget.
In this case, let us assume the link of this created page is:
https://yourloancompany.com/customerVerification.Now when a request is created, a link will be generated and sent in the response as:
https://yourloancompany.com/customerVerification?requestCode=<request_code>Note: The above links are just examples. You will need to use the URL that you have for your financial verification website.
3.2.1.1. Request Widget Integration and Communication
The method of integrating Request Widget is via iFrame. Communication between the parent page and the integrated iFrame happens via Javascript PostMessage API
Below is a sample JavaScript that creates an iFrame for loading the widget in a webpage. The script also contains code to catch messages from the iFrame via PostMessage API and handles success/failure redirections.
Note: Below provided script is just a sample script which creates and loads the Request Widget via iFrame and appends it to the document body of a webpage. The script can be modified to load or present the IFRAME anywhere that suits best for the applications needs.
let requestCode = document.location.search.substr(1).split("&")[0].split('=')[1]; // addEventListener support for IE8 function bindEvent(element, eventName, eventHandler) { if (element.addEventListener){ element.addEventListener(eventName, eventHandler, false); } else if (element.attachEvent) { element.attachEvent('on' + eventName, eventHandler); } } var iframeSource = `https://chirp.digital/api/widget?requestCode=${requestCode}`, results = document.getElementById("message"); // Create iframe var iframe = document.createElement('iframe'); iframe.setAttribute('src', iframeSource); // iframe.setAttribute('sandbox', "allow-scripts allow-top-navigation"); // iframe.setAttribute('sandbox', "allow-top-navigation"); console.log('doc width ', document.body.offsetWidth); iframe.setAttribute('id', 'the_iframe'); iframe.style.width = document.body.offsetWidth + 'px'; iframe.style.height = document.body.offsetHeight + 'px'; iframe.style.border = 'none'; document.body.appendChild(iframe); // Listen to messages from child window bindEvent(window, 'message', function (e) { console.log("from post message ", e.data) console.log("from post message ", e.origin) // if(e.origin == "https://chirp.digital"){ console.log("type of response ", typeof e.data) console.log("message from child ", e.data) // results.innerHTML = e.data; var messageFromParent = e.data // if(messageFromParent.success){ // window.top.location.href = e.data.urlToRedirect; // } // } });
3.3. Results Widget URL
Chirp provides a Results Widget URL to show the details of a verified request. This is useful for implementations that do not have specific requirements for how the loan underwriting process reviews the financial transaction details. This provides rapid implementation to see the results in an organized and readable format with similar functionality that is already built into the Chirp Portal user interface.
Sample implementation of the Results Widget URL:
https://chirp.digital/api/renderReport/<request_code>?token=<api_token>Request code and API token should be replaced with the actual request code and the API token.
Sample Results Widget URL page:

Figure 14: Request Widget Details
3.4. Results Widget URL V2
Chirp provides a hosted solution to not just show an extensively detailed view of your customer data but also to effectively manage them with features like Bank Refresh, Download customer reports as PDF, Excel and XML file formats. An LMS can directly integrate with Chirp and show this page in their application via an Iframe. The authorization mechanism used here is slightly different than others. A one-time usable token is required to be generated via generateAuthTokenForReportUI endpoint for loading this widget in an Iframe.
Below are the instructions to integrate this widget in an application,
- Generate a one-time usable token using generateAuthTokenForReportUI endpoint in the initial loading of your webpage where the renderReportUI/V2 widget is intended to be shown.
- Pass the request code as url param and the one-time usable token via query param as shown below in an Iframe to load the reports UI
https://chirp.digital/api/renderReportUI/v2/[request_code]?token=[generated_token_for_request_code]
Note: Request code and API token should be replaced with the actual request code and the API token.

Figure 15: Chirp IFV - Integrating Partner Results View Flow

Figure 16: Request Widget Details
3.5. Stand-Alone Website Integration Widget
Chirp provides a configurable widget that lenders can quickly integrate into their websites to verify their customers instantly when applying for a loan. This reduces the need for sending verification links via text or email to customers for financial institution verification and increases the conversion rate of the verification process. This widget is designed to be embedded as part of the lender’s website to reduce integration complexities and overhead for a lender. By default, the Custom Widget is not enabled for a Chirp Account so contact the Chirp support team if you would like this enabled for your Chirp Account.
If the lender wants the widget to be integrated as part of their workflow, there might be minor development required at the lender's end. The Chirp team can assist in setting up the workflow.
This widget requires basic customer information (first name, last name, email, and phone number) as inputs. Once the basic inputs have been provided, the request code generation process is entirely automated and managed by Chirp on the backend.
3.5.1. Implementing with a Standard Template
The verification widget should be loaded within the IFRAME of a webpage. This widget page can be included as the step next to the Loan Application Page. For example, when a customer fills in a loan application form, the submit option should trigger the page that will have the Chirp custom widget embedded in it. The customer’s first name, last name, email, and cell phone number are the four parameters required to be passed to load the widget.
Sample link for accessing this page:
https://yourwebsite.com/?firstName=<fname>&lastName=<lname>&email=<email>&phone=<phone#>From this page, customers will be able to search for the Bank Name and then login to their bank account to allow access to their financial data.

Figure 17: Website Verification Widget
3.5.2. Implementing with a Customized Template
The widget look and feel can be modified by the Entity Admin via the Chirp Portal User Interface. Below are the step-by-step instructions to customize the widget.
- Login to the Chirp Portal as the Entity Admin.
- Expand “Settings” in the left-hand navigation menu, select "Widget Configuration.”
- If the "Widget Configuration" option is not available, please contact Chirp support and request it to be enabled.
- You will be presented with an interface where you can customize the look and feel of the widget.
- Modify colors as desired and click “Save.”
- Select the "Show skip button” if you want to allow the customer to skip the verification process.
- Select the “Config Tab” (after you finish the design and click “Save”).
- From the text editor, you will be able to modify the terms & conditions based on your requirements or just accept the standard terms & conditions as-is.
- Select the Chirp Profile for the customized widget to integrate with.
- Select Production or Sandbox environment.
- If you selected the “Show skip button” on the “Design” tab:
- Enter the redirection URL if the customer skips the verification process.
- Setup email notifications for your team:
- Enter one or multiple emails for your team(s) to be notified as the customer interacts with the widget.
- Customer closes the verification widget
- Customer skips the verification widget
- Customer attempts to verify a request
- Customer verifies a request successfully
- Enter one or multiple emails for your team(s) to be notified as the customer interacts with the widget.
- Click "Save and Generate" once all edits are finalized.
- This will generate the “Integration Script” on the right side of the interface. Copy the script by clicking on the "Copy" button and use this script appropriately on your website to integrate the widget with Chirp.

Figure 18: Widget Configuration

Figure 19: Widget Configuration
3.5.3. Stand-Alone Website Integration Widget Sample Process Flow
This section provides a sample process flow for lead providers, loan system providers, and lenders of how the Chirp Stand-Alone Website Integration Widget could be implemented. The integration script can be generated and used from the “Implementing with a Customized Template” section.
Sample Process Flow
- Customer navigates to or is redirected to a webform
- The customer completes and submits the webform
- The form can collect whatever information you would like; however, these basic attributes are required by the widget.
- First Name
- Last Name
- Phone
- The form can collect whatever information you would like; however, these basic attributes are required by the widget.
- The form should redirect the customer to the web page, where the widget will be loaded with the basic info passed in the header/query parameters.
- Chirp script is included in the lenders' verification webpage. https://lenderssite.com/verification-widget handles extracting information from the headers and loads the verification widget in the place where the script is included.
- Further illustration:
- Starting point webform
- https://leadprovidersite.com/apply
- Redirected to:
- https://lenderssite.com/verification-widget
- With basic info in the headers as follows:
- https://lenderssite.com/verification-widget?firstName=john&lastName=doe&email=johndoe@somedomain.com&phone=11111111111
- Starting point webform
- Customer selects the bank and proceeds with verification.
- Customer is redirected to success or failure URLs based on the configuration in the Profile used for the verification widget. No redirection will happen if the redirection URLs is saved empty.
- Customer is allowed to resubmit valid credentials on a failure attempt, and the number of times allowed can be configured in the Profile using "Max Login Attempts" option.
In summary, this widget requires basic customer information (first name, last name, email, and phone number) as inputs. Once the basic inputs have been provided, the request code generation process is entirely automated and managed by Chirp on the backend.
Here are the three possible workflows (assuming all required elements are provided to the widget and no other error conditions occur):
- The widget is loaded with new basic customer information.
- A new verification request will be generated, and the widget will present the bank search screen to the customer.
- The widget is loaded with existing basic customer information, and the verification request has not reached the end of the request lifecycle (verified, rejected, or expired).
- The existing verification request will be used, and the widget will present the bank login screen to the customer.
- The widget is loaded with existing basic customer information, and the verification request has reached the end of the request lifecycle (verified, rejected, or expired).
- A new verification request will be generated, and the widget will present the bank search screen to the customer.
3.6. ChirpLink™
ChirpLink™ is Chirp’s custom and proprietary widget for linking customer financial accounts to merchant applications using a plug-and-play integration setup.
Here’s a sample ChirpLink™ widget integration implementation:
- Load the ChirpLink™ widget script via the Chirp CDN link -
<script src="https://chirp.digital/cdn/chirplink.js"></script>
- Generate a token based on the request code using genAuthTokenForChirpLink endpoint to access ChirpLink™ (details explained below).
- Initiate and monitor the ChirpLink™ widget per your workflow using the associated APIs
- Listen for responses provided by the event callbacks listed below
- onLoad - This event is fired as soon as the widget is loaded, it also provides request code and status of the link whether it is expired or not.
- onBankSelect - This event is fired when the customer selects the bank they want to link. This event also provides the details of the selected bank.
- onSuccess - This event is fired once the customer completes the verification process.
- onError - This event is fired when an error occurs during the verification process. The details of the error are also shared.
- onClose - This event is fired when the customer closes the verification widget along with the step number from where the ChirpLink™ widget was closed.
- onAttempt - This event triggers when the user attempts the verification widget.
- The ChirpLink™ widget also provides a method called close() that can be used to programmatically close the widget as per the integration workflow
The detailed explanation of all these events and method can be found under the section below
ChirpLink™ CDN Link - https://chirp.digital/cdn/chirplink.js
3.6.1. Customization Options for ChirpLink™
# | Option | Description |
---|---|---|
1 | token | Token generated for initiating a customer verification in the entity's integration. This token is mandatory for ChirpLink™ |
2 | mode | Mode of the widget to be rendered as per integration. This is an optional field. The two possible modes supported by the widget currently are “POPUP” and “ADAPTABLE”. This is an optional field and defaults to opening as a POPUP if unspecified or incorrectly spelled |
3 | onLoad | This event is fired as soon as the widget is loaded, it also provides request code and status of the link whether it is expired or not |
4 | onBankSelect | This event is fired when the customer selects the bank they want to link. This event also provides the details of the selected bank |
5 | onError | This event is fired when an error occurs during the verification process. The details of the error are also shared |
6 | onClose | This event is fired when the customer closes the verification widget along with the step number from where the ChirpLink™ widget was closed |
7 | onSuccess | This event is fired once the customer completes the verification process |
8 | onAttempt | This event is fired once the customer attempted to verify during verification process |
The events are explained in detail with examples in the Event Callbacks section
3.6.2. Event Callbacks
ChirpLink™ provides six events that you can use to customise the behaviour of the verification widget
3.6.2.1. onLoad
Triggered as soon as the widget is loaded, indicating the widget is loaded and ready. It also returns a payload containing relevant data associated with the loaded widget. The payload structure may include properties such as requestCode and isLinkExpired (whether this link is expired or not), providing valuable information for further processing.
Example payload structure
{ requestCode: "QLU0GU", isLinkExpired: true, message: "Request code QLU0GU is expired. Please contact <phoneNumber> <profileName> at <supportEmail> with the request code for further assistance." }
Payload definition
requestCode: Request code of the verification flow.
isLinkExpired: Status of the link whether it is expired or not.
message: Description of the reason why this link has expired. This field is included only if the link expires.
3.6.2.2. onSuccess
Triggered when a verification operation is completed and the financial account is linked. This event provides an object containing valuable information, offering insights into the success status and a URL for redirection.
Example success payload structure
{ success: true, urlToRedirect: "sampleSuccessURL.com", status: "VERIFIED", statusDetails: "NA" }
Example failure payload structure
{ success: false, urlToRedirect: "sampleFailureURL.com", status: "ATTEMPTED", statusDetails: "Attempted - Credential Error" }
Payload definition
success: A boolean value indicating the success status of the verification process. If true, the verification was successful.
urlToRedirect: A URL to which the user can be redirected after the verification process. This is useful for both success and failure scenarios.
status: Status of the verification request, possible values are "VERIFIED", "REJECTED" or "ATTEMPTED"
statusDetails: Status description of the verification request, possible values are "Attempted - In Progress", "Attempted - Bank Error", "Attempted - Credential Error" or "NA"
3.6.2.3. onError
Triggered when an error occurs during the execution of specific functionalities throughout the verification process. This could include errors related to verification processes and API calls
Example payload structure
{ success: false, errorMessage: "sample error message" }
Payload definition
success: A boolean value indicating the success status of the operation. If false, an error occurred.
errorMessage: A string providing an error message explaining the nature of the error.
3.6.2.4. onClose
Triggered when the user closes the verification widget. It serves as a valuable indicator of user interactions and can be used to track the progression or completion of various verification stages like CUSTOMER_CONSENT, BANK_SELECTION, INITIAL_LOGIN, MFA, VERIFIED, EXPIRED, or REJECTED.
CUSTOMER_CONSENT - Initial landing page of the widget
BANK_SELECTION - Page for users to select their bank
INITIAL_LOGIN - Initial login page where users enter their credentials
MFA - Page for additional security verification
VERIFIED - Confirmation page indicating successful completion of the authentication process
EXPIRED - Page notifying users when their session or verification has expired
REJECTED - Page indicating that the given request code is rejected
Example payload structure
{ pageClosed : true, closedPage : "CUSTOMER_CONSENT" }
Payload definition
pageClosed: A boolean value indicating whether the page was closed. If true, the page was closed.
closedPage: A string specifying the specific page that was closed. Possible values include CUSTOMER_CONSENT, BANK_SELECTION, INITIAL_LOGIN, MFA, VERIFIED, EXPIRED, or REJECTED.
3.6.2.5. onBankSelect
Triggered when the user makes a bank selection, and it provides an object containing details such as whether a bank was selected and the name of the selected bank.
Example payload structure
{ bankSelected: true, bankName: "Chirp Test Bank", bankUrl: "sampleUrl.com" }
Payload definition
bankSelected: A boolean value indicating whether a bank was selected. If true, a bank was selected.
bankName: A string specifying the name of the selected bank.
bankUrl: A string specifying the official site url of the selected bank.
3.6.2.6. onAttempt
Triggered when the user attempts the verification widget. It serves as a valuable indicator of user interactions and can be used to track the attempted progression of various verification attempted stages like CREDENTIAL_ERROR, BANK_ERROR and IN_PROGRESS.
CREDENTIAL_ERROR - Indicates that the credentials supplied for verification are invalid.
BANK_ERROR - Indicates that the error is caused by an issue on the bank's end.
IN_PROGRESS - Indicates that the verification process is currently ongoing.
Example payload structure
{ attempted: true, message: "CREDENTIAL_ERROR" }
Payload definition
attempted: A boolean value indicating the status of the attempt.
message: A string specifying the attempted message. Possible values include CREDENTIAL_ERROR, BANK_ERROR or IN_PROGRESS.
3.6.3. Close method - close()
The close method should be used for closing the ChirpLink™ widget programmatically as per the integration workflow. Successful execution of this method triggers the onClose event upon completion which also provides more details about the closed page through the field closedPage in the event callback payload.
Before the close() method can be used, the ChirpLink™ widget must have already been initialized like the sample below.
var newChirpLink = new ChirpLink({ …options });
The close button can then be called as needed to close the ChirpLink™ widget programmatically
<button onclick="newChirpLink.close()">Close ChirpLink</button>
3.6.4. Integration Steps in Detail and Sample Script
3.6.4.1. Add ChirpLink™ Script
Include the Chirp script in your website's script file by adding this below mentioned CDN link. ChirpLink™ CDN Link - https://chirp.digital/cdn/chirplink.js
3.6.4.2. genAuthTokenForChirpLink - (POST)
It is used to generate a one-time accessible token associated with a request code for Chirp verification. The endpoint is accessible via a POST request and returns a response containing details about the generated authentication token.
Endpoint : https://chirp.digital/api/genAuthTokenForChirpLink/chirpLink/<request_code>
Headers - Authorization : <profileToken>
Example success response:
Status code: 200
{ "success": true, "token": "y5yh45h4w5h45h4j4w6j4wj4htrhw6u65h6j56h5y", "requestCode": "QLU0GU", "validUpto": "8/10/2021, 10:33 PM" }
Response Field Definition:
success: Response result of the request
token: Token generated for initiating a customer verification in entity’s integration
requestCode: The request code for which the token is valid
validUpto: The expiration time until the generated token is valid. Timezone is CST
3.6.4.3. Integration
After successfully retrieving the token using the genAuthTokenForChirpLink endpoint, you must integrate the token into your script. Sample script was mentioned below.
3.6.4.4. View
In desktop mode, the verification widget is displayed as an overlay popup in the center of the screen. Users can interact with the ChirpLink™ widget without navigating away from the current page.
In mobile mode, the verification widget will automatically overlay the full size of the screen.
3.6.4.5. Sample script for events
var newChirpLink = new ChirpLink({ token:"y5yh45h4w5h45h4j4w6j4wj4htrhw6u65h6j56h5y", onLoad: function (load) { console.log('On Load event', load); }, onSuccess: function (success) { console.log('On Success ',success); }, onError: function (err) { console.log("On Error ", err); }, onClose: function (close) { console.log("on Close",close); }, onBankSelect: function (bank) { console.log("On Bank Select", bank); }, onAttempt: function (attempt) { console.log("On Attempt", attempt); } });
3.6.5. Create Custom Customer Messages
A message is shown to the end customer when the request reaches an end state(connected, rejected, or expired). This message can be customized by the Entity in the Chirp Portal. Click here to view the Portal documentation.
3.6.6. Adaptable ChirpLink™
ChirpLink™ can also act as an adaptable widget to be placed anywhere on a webpage. This helps with creating custom workflows and placing the ChirpLink™ widget in a container
3.6.6.1. Setting up the Container
To utilize the adaptable feature of ChirpLink™, you need to designate an HTML element to serve as the container for the widget. Here's how you can create this container:
<div id="chirpLinkWidget"></div>
Ensure that the container element is placed appropriately and is also properly created within the HTML structure if added dynamically.
3.6.6.2. Integrating Adaptable ChirpLink™
To integrate the ChirpLink™ widget in its adaptable mode, follow these steps:
var newChirpLink = new ChirpLink({ token:"y5yh45h4w5h45h4j4w6j4wj4htrhw6u65h6j56h5y", mode : "ADAPTABLE" )}
The mode should be set to “ADAPTABLE” as its value for making the widget adaptable to a container. If the mode parameter is not specified or incorrectly spelled, the widget defaults to opening as a popup.
ChirpLink™ provides six events that you can use to customize the behavior of the verification widget. Click here to learn more about these callback events.
4. Chirp Webhooks
Chirp webhooks provide a way for integrating partners to subscribe to real-time, event based,status updates. To be successful the webhook URLs provided by Chirp integrating partners must be an open POST endpoint. Chirp currently offers webhook status updates for REQUEST_STATUS and REFRESH_STATUS.
To configure Webhook URLs visit the Notifications option under the Settings menu and add a new notification as shown in the figure below. The URLs can be configured in a way that is most effective for the integration partners system. For example the REQUEST_STATUS and REFRESH_STATUS can be configured to share a single a URL for either event or each event can be registered with a unique URL.

Figure 20: Chirp Webhooks
4.1. Webhook Events
4.1.1. Request Status
The REQUEST_STATUS webhook event is used to proactively send notifications when actions occur that are specific to changes in the status of a request.
4.1.1.1. action: UPDATED
The Request Status webhook event will send notifications under this action when Chirp detects a change in a request status. For instance – if a request status is updated from Unverified to Attempted a status update event will be posted to the registered POST URL.
{ requestCode: “QLU0GU”, type: “REQUEST_STATUS”, action: “UPDATED”, status: “Verified”, firstName: “John”, lastName: “Deo”, customerId: “YYYYY”, productId: “ZZZZZ”, statusDetails: “NA” }
4.1.2. Refresh Status
The REFRESH_STATUS webhook event will send an update when Chirp detects a change in the refresh status. For instance – if a refresh status is updated from Verified to Rejected a status update event will be posted to the registered POST URL.
{ requestCode: “QLU0GU”, type: “REFRESH_STATUS”, action: “UPDATED”, status: “Success”, firstName: “John”, lastName: “Deo”, customerId: “YYYYY”, productId: “ZZZZZ” }
4.2. Webhook Logs
Webhook event requests are logged and can be viewed in the left hand Navigation panel by the Entity Admin and Entity Global users for debugging purposes. The webhook full response can be viewed by clicking View icon.

Figure 21: Webhook Logs
For a comprehensive list of HTTP responses see
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status5. Integrating Partner Request Management
5.1. Business Case
Chirp integration partners should track each Chirp request code with data from their integrating system and evaluate what action to take with Chirp in the workflow. The most common actions would be 1) create a new request, 2) re-use an open request until that open request reaches the end of the life cycle (verified, rejected, or expired) or 3) display a message that the verification has already been successfully completed.
Consider this lender and borrower example. The LMS would store the Chirp request code and the loan/application information for that request code. When the borrower attempts to visit the IFV page the LMS would evaluate the status of loans/applications against the borrower and take the appropriate steps.
5.1.1. Create New Request Samples
- A new loan was created for a new borrower with no previous verification.
- A new loan was created for an existing borrower with a successful verification from a previous loan.
- A new loan was created and the borrower attempted bank verification for an incorrect bank and would like to select a new bank even though there’s already an open request.
5.1.2. Re-Use Existing Open Request Sample:
- The borrower re-visits the bank verification page because they lost connection before completing the verification.
- The borrower re-visits the bank verification page because they didn’t have all of the information to complete verification the first time
- The borrower re-visits the bank verification because they are not sure if they already completed the bank verification step
- The borrower re-visits the bank verification page because of a temporary technical issue at the financial institutions end on the previous attempt
5.1.3. Display Request Connection Status on IFV Page
If the borrower re-visits the IFV page and the workflow rules indicate that a successful verification already exists for the borrower/loan combination the LMS should display a message to the borrower that the verification has already been completed. Here's a suggested message to present to the borrower. "Your bank verification information for <bank-name> was successfully completed in an earlier session. You should be hearing from your <lender-name> soon."

Figure 22: Chirp IFV - Integrating Partner Flow
6. Understanding Error Messages
6.1. Common Error Messages
The following tables are lists of common error messages while interacting with Chirp APIs.
6.1.1. Requestor Error Codes and Messages
Error codes and messages returned in cases of requestor errors
# | Scenario | Error Code | Error Message Returned |
---|---|---|---|
1 | If Sandbox API access is not enabled | 403 | Sandbox environment access is not enabled for your entity |
2 | If Content-Type header is not passed | 406 | Please check the headers passed and try again |
3 | If IP Address is not whitelisted | 403 | IP address <ipAddress> is used not whitelisted to access API. Please contact Chirp Support for assistance, support@chirp.digital |
4 | If Production API access is not enabled | 403 | Production environment access is not enabled for your entity |
5 | If the profile is deactivated | 403 | The profile <profileName> is deactivated. Please try again with an active profile or contact support@chirp.digital for more information. |
6 | If an invalid access type header is passed | 406 | Not Acceptable! Supported 'Accept' header values are - 'text/xml' and 'application/json' |
7 | If the request entity has no API Access for sandbox environment | 403 | The request entity <entityName> has no API Access for sandbox environment. |
8 | If the request entity has no API Access for production environment | 403 | The request entity <entityName> has no API Access for production environment. Please contact Chirp Support for assistance, support@chirp.digital |
9 | If the request code is not available for the Profile | 405 | Profile <profileName> has no such request code. Please try again with a valid request code |
10 | If requestor attempts to get request details for a request code is with the wrong token | 400 | Request code invalid. Please check the environment of the API token passed and try again! |
11 | If the requesting API endpoint exceeds the maximum limit configured | 429 | Allowed API usage exceeded. Please contact support@chirp.digital for more information to know more |
6.1.2. System Error Codes and Messages
Error codes and messages returned in cases of system errors
# | Scenario | Error Code | Error Message Returned |
---|---|---|---|
1 | If the system is unable to process a request from a third-party service | 503 | We are unable to process your request. Please contact Chirp support at support@chirp.digital for more details |
2 | If the server is down and the system is unable to handle requests | 502 | We are unable to process your request. Please contact Chirp support at support@chirp.digital for more details |
6.1.3. Widget Error Messages
The following table is a list of common error messages presented to the user during verification.
# | Scenario | Error Message Prompted |
---|---|---|
1 | If the credentials supplied for verification are invalid | Invalid credentials! |
2 | If the login form is submitted with any mandatory fields missing | All fields are mandatory. Please fill in the fields to continue. |
3 | If the maximum number of allowed invalid login attempts is exceeded | Request is rejected. Maximum number of login attempts exceeded! |
4 | If request code status is “Verified”,” Expired” or “Rejected” | The link has been expired. Please try again with a different request code! |
5 | If server is unavailable or not responding | We are unable to process your request. Please contact Chirp support at support@chirp.digital for more details |
7. Contact Information and Support
For questions, feedback or support implementing Chirp please contact your account manager or contact us at support@chirp.digital or webform .