Skip to main content

Cash Atlas V1 API Reference

API Reference Overview

Introduction

This document provides information on how to interact with the Nova Credit API to obtain a Cash Atlas report.

The best way to get the Cash Atlas report using Nova Credit's API is to have your applicants use NovaConnect, an easy-to-use and secure JavaScript module. Visit our Quickstart Guide for all details on how to get Nova Credit API credentials and integrate NovaConnect into your app or website today.

Framework and Protocol

The Nova Credit API is organized around REST. It uses resource-oriented URLs, HTTP response codes, and native HTTP functionality such as authentication and verbs. Note that our APIs are served over HTTPS; HTTP is not supported in production.

Delivery Formats

JSON is the default response format.

Endpoints

Our API host is api.novacredit.com. (See Quickstart Guide for environment information.)

Our resource URL patterns are:

ValueDescription
/connect/accesstokenRetrieves an access token for an applicant's Cash Atlas report
/connect/cash-atlas/v1/jsonRetrieves an applicant's Cash Atlas report in JSON form
/connect/cash-atlas/v1/files/<filepath>Retrieves a file associated with an applicant's Cash Atlas report. File endpoint is a draft and is subject to change.
/connect/statusRetrieves the status of an applicant's Cash Atlas report

Visit our Quickstart Guide to see details on how to call these endpoints with examples.

Data Types & Formats

Data Types

TypeDescription
StringExtended character set, numbers and punctuation symbols. This includes non-ASCII language-specific characters such as ß, à, ç, é, and more (all encoded as utf8).
IntegerA rounded numerical value.
FloatA 64-bit floating decimal point format.
BoolA boolean-flag indicating true or false.
ObjectNested JSON level with more field-values.
ArrayA value or type array contains a zero or positive amount of elements. The elements can be of any type.

Data Formats

FormatDescription
Timestamp(String) UTC ISO 8601 data and time format. Full specs according to RFC 3339. Example: 1982-09-26T32:20:50.52Z
Full Date(String) UTC ISO 8601 date format. Full date format in YYYY-MM-DD. Example: 1982-09-26
Short Date(String) UTC ISO 8601 date format. Shorter format in YYYY-MM. Example: 1982-09
UUID(String) Universally Unique Identifier according to RFC 4122
URI(String) Uniform Resource Identifier according to RFC 3986
Full Version(String) Semantic versioning. http://semver.org/
Confidence Score(Integer) A number from 0 to 100 -- the higher the score, the greater Nova Credit's confidence in the corresponding value is

Webhooks

Webhooks are the mechanism that Nova Credit uses to inform you of core initialization and completion steps for each widget interaction. One session can consist of multiple suppliers. Only one terminal status outcome is sent per widget open; other supplier-flow outcomes are recorded and attached to the webhook body in the history node.

We make a POST API call to the webhook callback URL that you provide. Webhooks can be managed in the Developer tab on the Nova Credit Dashboard, where you must set your callback URL and can toggle your various event subscriptions on and off. Some events or statuses are subscribed to by default.

Webhook Event Types

Each Webhook API call will contain one of the event types listed below in the JSON body:

Event TypeDescription
VISITA single NovaConnect widget interaction, which can consist of multiple suppliers. Only one terminal status outcome is sent per widget open; other supplier-flow outcomes are recorded and attached to the webhook in the history node
REGENERATED_VISITOnly occurs for reports that have been regenerated. This event type also includes a novaReportRevision in the webhook body.

Webhook Status Codes

Each Webhook API call will contain one of the status codes listed below:

StatusDescriptionTerminal Status?
PENDINGA visit has been initialized upon opening the NovaConnect widget, or a given supplier has been chosen
SUCCESSThe data source has successfully provided information on the applicant
EXPIREDThe visit has expired before the applicant was able to complete the flow. This will be sent if no completion 72 hours after initial widget opened
ERRORAn error occurred and the Cash Atlas Report could not be compiled. If there isn't a detailed substatus, send a message to your Nova Credit Representative with the publicToken
SKIPPEDThe applicant opted not to finish the visit or supplier. This can be caused by exiting from the Cash Atlas widget or clicking a button to skip (for example, clicking "I cannot complete this step")
BUREAU_UNRESPONSIVEThe applicant has encountered a data supplier outage while going through the widget. They may need to go through NovaConnect again at a later time
NOT_AUTHENTICATEDThe applicant was unable to verify their identity
NON_CONTRIBUTING_APPLICANTThe applicant selected to not contribute income

Webhook Body

Webhook Body KeyDescription
eventTypeEvent Type (see event type table above) corresponding to this webhook
statusStatus (see status code table above) corresponding to this webhook
substatusA more detailed status. See substatus types
publicTokenUnique UUID associated with this status, which can be used to retrieve the Nova Credit report
externalIdOptional unique identifier passed in by the Nova Credit customer (you) with this application. This key will only be present if externalId was passed in
userArgsOptional string passed in by the Nova Credit customer (you) with this application. This key will only be present if userArgs was passed in
eventIdUnique ID for the webhook
eventCreatedTimeWebhook event timestamp
novaReportRevisionOnly included for webhooks with the REGENERATED_VISIT event type. Refers to the revision number of the report
historyAn array containing 1 or more objects, containing data on all of the statuses an applicant has reached within one Cash Atlas widget instance, sorted by most recent to least recent
history.eventTypeEach history object will have a SUPPLIER event type
history.companyCodeData supplier for this history object
history.dateAttemptedTimestamp marking when this corresponding history object was begun
history.statusStatus (see status code table above) corresponding to this history object
history.substatusA more detailed status. See substatus types

Note that the status will be informed by the most recent supplier event status.

Example:

{
eventType: 'VISIT',
status: 'SUCCESS',
publicToken: '6b986690-458b-11e7-98fb-a71570ea65a6',
externalId: '25ad7063-fe76-437a-b4d8-3662ba4cc9c7',
userArgs: '235234224',
eventId: '028d9354-3991-46c4-97df-bd6c2ff09733',
eventCreatedTime: '2019-09-26T33:15:23.17Z',
history: [
{
eventType: 'SUPPLIER',
status: 'SUCCESS',
substatus: 'ACCOUNT_TOO_NEW',
companyCode: 'USA_FIN',
dateAttempted: '2019-09-26T19:20:00.00Z' // newest timestamp
},
{
eventType: 'SUPPLIER',
status: 'PENDING',
companyCode: 'USA_FIN',
dateAttempted: '2019-09-26T19:18:00.00Z' // oldest timestamp
}
]
}

Webhook Signature

Nova Credit optionally signs webhook payloads in order to allow for trust verification of inbound webhook requests. When configured, the webhook request will contain these additional headers:

HeaderValue
X-Timestamptimestamp of request generation
X-Nova-SignatureSHA256 HMAC digest of request timestamp and payload, period-delimited. Your Webhook Signatures Secret Key is found under the Webhooks section on the Developer tab of your Nova Credit Dashboard.

Please contact your Nova Credit account manager to enable this feature.

Example verification of signature:

const crypto = require('crypto');

const signature = req.get('X-Nova-Signature');
const timestamp = req.get('X-Timestamp');

const checkPayload = `${timestamp}.${JSON.stringify(req.body)}`;
const checkDigest = crypto.createHmac('sha256', '< webhook secret key >')
.update(checkPayload)
.digest('base64');

return crypto.timingSafeEquals(signature, checkDigest);

Sandbox Mode

Finicity

To access a Cash Atlas sandbox report, you must pass certain identifying consumer information into the Cash Atlas widget. This information may be passed in directly via prefill keys. Please refer to the Quickstart Guide to learn more about prefill keys.

Along with the identifying consumer information that is collected, the user may connect their bank account through our partner, Finicity, Inc. Finicity provides a set of usernames and password combinations for testing purposes that can be found in the Finicity documentation. For example, selecting FinBank and using a username/password of demo/go will allow you to connect test accounts.

The following Nova Credit test user reports have been created and can be accessed by inputting the following information:

InputsDefault UserSingle Primary Account UserMulti-Account UserJoint Account UserDebt Account Linked UserNo Income User
First nameRaymondSarahMikeJasonDerekNolan
Last nameMarshalSingleManyJointDebtNoTransactions
Date of birth1995-10-011986-10-121992-05-081976-03-091984-04-121992-03-07
Email addressraymond@email.comsarah@email.commike@email.comjason@email.comderek@email.comnolan@email.com
Phone310-555-6789415-231-5348917-340-3249208-351-0093512-213-3322217-277-6633
Address456 7th Street6100 Evergreen Way915 Snover Street2213 W Montrose Avenue1105 Bowie Rd6300 N Illinois St
CityModestoEverettHoustonChicagoAustinFairview Heights
StateCAWATXILTXIL
Zip953139820377007606187877362208
Stated employerRaymond's DesignsBoeingTargetMicrosoftCharles SchwabOptional
Stated annual income1200012000073000110000135000Optional

These users will return a SUCCESS status in the webhook. The "No Income User" will return with a NO_RECENT_USABLE_INFORMATION substatus.

Refer to the Finicity documentation to view alternative user ID and password combinations to trigger different Finicity states.

If testing multiple aggregators in sandbox mode, you will need to select a bank first. Please select FinBank to connect with Finicity.

Simulating Different Cases in Sandbox

Enter the following inputs as the "Last Name" of the applicant in prefills to simulate a different case.

InputsDescription
expiresoonSimulates the EXPIRED status, immediatey instead of waiting 72 hours
supplierdownSimulates the BUREAU_UNRESPONSIVE status

Akoya

Users may also connect their bank accounts through our partner Akoya to access a Cash Atlas sandbox report. Upon loading the widget, select the test user displayed, and the appropriate report will be fetched. The test users mirror those above for Finicity.

If testing multiple aggregators in sandbox mode, you will need to select a bank first. Please select Mikomo to connect with Akoya.

Paystub Verification

For testing purposes on the paystub page of the Cash Atlas widget, we have provided a set of filename combinations that correspond with different outcomes. These are as follows:

FilenamePaystub OutcomeDetect Outcome
emeliaSUCCESS (default paystub)Not Detected
emelia_detectedSUCCESS (default paystub)Detected
emelia_timeoutSUCCESS (default paystub)Timeout
emelia_errorSUCCESS (default paystub)Error
emptyNOT_AUTHENTICATED (empty paystub)Error
marieSUCCESS (thin file paystub)Not Detected
larrySUCCESS (low income paystub)Not Detected
downBUREAU_UNRESPONSIVEN/A
missingfieldsSUCCESS (paystub which is missing fields)Not Detected
Any other filenameNOT_AUTHENTICATEDError

In addition to these filename combinations, we have provided inputs to trigger fraud outcomes in the irregularity detection response.

Fraud v2 Sandbox

These inputs should be passed in directly using prefill values, and can be used in combination with the emelia filename above. Please refer to the Quickstart Guide to learn more about prefill keys.

These prefill values will only work if fraud v2 is enabled for your account in addition to irregularity detection. See irregularity_detection

For each outcome below, use a Prefill First Name of getAdaptiveDecisionResult

Prefill Last NameIrregularity Detection StatusFraud Indication Verdict
errorN/AN/A
pdfTrustedNot DetectedTrusted
pdfHighRiskDetectedHigh Risk
pdfWarningDigitalPrintNot DetectedWarning
pdfWarningApprovedReviewWarning
pdfNormalNoDigitalModificationNot DetectedNormal
pdfNormalApprovedReviewNormal
pdfNormalManualReviewReviewNormal
imageTrustedNot DetectedTrusted
imageHighRiskApprovedDetectedHigh Risk
imageHighRiskManualReviewDetectedHigh Risk
imageWarningApprovedNot DetectedWarning
imageWarningManualReviewDetectedWarning
imageNormalNoDigitalModificationNot DetectedNormal
imageNormalOtherReviewNormal
Fraud v3 Sandbox

These inputs should be passed in directly using prefill values, and can be used in combination with the filenames above. Using the emelia_detected filename will always result in an outcome of DETECTED.

For each outcome below, use a Prefill First Name of getAdaptiveDecisionResult.

Prefill Last NameFile TypeIrregularity Detection Status
pdfTrustedpdfNOT_DETECTED
pdfHighRiskpdfDETECTED
pdfWarningApprovedpdfREVIEW
imageTrustedimageNOT_DETECTED
imageHighRiskManualReviewimageDETECTED

USA_ATOMIC

Sandbox Testing

We provide multiple sandbox users for testing: Jane, Alice and Paddy.

To access the reports please pass the first names via prefill keys and then choose Test User on the Atomic Simulator page. If you do not enter a name for any of the sandbox users, we will default to the "Jane" report.

Here is some information about each sandbox report.

Report InfoJane (Default)AlicePaddyJimmyPatricia
Employment Statusactiveterminatedactiveactiveactive
Employment Typefulltimefulltimefulltimefulltimefulltime
Annual Income6000021612156013.213000052000
Pay Frequencymonthlysemimonthlysemimonthlybiweeklyweekly
Widget Testing

If you are using the sandbox, you will see a special Atomic Simulator page instead of the Atomic Widget. This page contains multiple options for testing different widget states. You can test success flows, cascade and various Atomic failure states.

If you are performing production testing, then you can use the Atomic Widget to trigger different testing scenarios. Here is a list of different test cases. The test cases should work for any source provider as long as you enter the name and phone number as specified for each test case.

Report Structure

Example of the JSON structure of the Cash Atlas report response:
{
"meta": {
...
},
"product": {
...
},
"sources": [
...
],
"identities": [
...
],
"employment": [
...
],
"bank_transactions": [
...
],
"expenses": [
...
],
"income": {
...
},
"metrics": [
...
],
"attributes": [
...
],
"adverse_action_codes": [
...
]
}

The Cash Atlas report response structure is as follows:

  • meta {object}
  • product {object}
  • sources {array}
  • identities {array}
  • employment {array}
  • bank_transactions {array}
  • expenses {array}
  • income {object}
  • metrics {array}
  • attributes {array}
  • adverse_action_codes {array}

Report Body

meta {}

Example snippet of meta in the report response:

{
"meta": {
"public_token": "ff0886a4-f3ff-11e6-bc64-92361f002671",
"user_args": "235234224",
"created_at": "2017-01-13T11:07:46.51Z",
"api_version": "4.6.85",
"nova_report_revision": "1",
"external_id": "d167c6bb-225c-461c-be63-f0bc3a1f62ea"
},
...
}

Information specific to the report that's been returned.

FieldFormatNotes
public_tokenUUIDThe unique identifier of this report
user_argsStringThe input of the userArgs function in NovaConnect
created_atTimestampThe date the credit report was retrieved
api_versionFull versionThe API version used to generate this report
external_idStringThe unique applicant identifier of the report from your system. Can be null if it is not provided.
nova_report_revisionStringThe revision name for this report. This field will be null if this report has never been revised.

product {}

Example snippet of product in the report response:

{
"product": {
"name": "Village Communities",
"product_id": "9cf178e0-760e-11e7-abf3-5da9d338ae4b",
"inquiry_type": "TENANT"
},
...
}

Details of the product the applicant applied for. Please refer to the Client-Side Integration section in the Quickstart Guide.

FieldFormatNotes
nameStringProduct name
product_idUUID
inquiry_typeStringSee product inquiry_type values

sources []

Example snippet of sources in the report response:

{
"sources": [{
"source_id": "USA_FIN",
"source_type": "BANK",
"status": "SUCCESS"
}],
...
}

A list of data sources used to build the applicant's report.

FieldFormatNotes
source_idStringA human-readable identifier for the source, unique within the context of the report
source_typeStringSee source_types
statusStringThe final status for the source. See status

identities []

Example snippet of identities in the response:

{
"identities": [{
"source_id": "CONSUMER_INPUT",
"first_name": "Raymond",
"last_name": "Marshal",
"emails": ["raymond@email.com"]
}],
...
}

The applicant's personal identity information reported from each data source.

FieldFormatNotes
source_idStringThe identifier for the source that reported the identity information. See sources
source_record_idUUIDThe identifier for an individual record within a source
first_nameString
last_nameString
full_nameString
middle_nameString
other_namesArray of StringA list of other names associated with applicant, such as aliases, maiden names, and other surnames
emailsArray of String
telephonesArray of String
matchingObjectSee matching

matching {}

Example identities matching field object for case where there is a full name match:

{
"matching": {
"full_name": {
"matched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "5f19d40f-3c19-4a7d-ad7b-cc28dac40c4d"
}
],
"unmatched_sources": []
}
}
}

Example identities matching field object for case where there is no full name match:

{
"matching": {
"full_name": {
"matched_sources": [],
"unmatched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "c31bf8c7-c25b-4d2c-a4bc-61f79fd46e65"
}
]
}
}
}

Information about sources which have matching and conflicting values to a particular identity.

matching is returned in an object broken out by field, only certain fields are matched between sources. If only one identity item exists, there will be no matching field. Information about matching sources is stored wrapped in the MatchingField format, which indicates where each value was sourced from.

FieldFormatNotes
full_nameObjectMatched and unmatched sources for the full name of the applicant
MatchingField {}
Example matching field object for case where there is a field match:

{
"matched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "5f19d40f-3c19-4a7d-ad7b-cc28dac40c4d"
}
],
"unmatched_sources": []
}

Example matching field object for case where there is no field match:

{
"matched_sources": [],
"unmatched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "c31bf8c7-c25b-4d2c-a4bc-61f79fd46e65"
}
]
}

An object containing information about which sources have a matching value for a field and which sources contain conflicting values for the same field. A source is an object containing a source_id and a source_record_id if there are multiple source records.

FieldFormatNotes
matched_sourcesArrayList of sources which have a value that matches this identity. See sources
unmatched_sourcesArrayA list of sources which have a value that conflicts with this identity. See sources

employment []

Example snippet of employment in the report response:
{
"employment": [
{
"source_id": "OCROLUS",
"employer_name": "Microsoft",
"employer_address_line_1": "1 Microsoft Way",
"employer_address_line_2": null,
"employer_city": "Redmond",
"employer_state": "Washington",
"employment_type": "fulltime",
"employment_status":"active"
"job_title": "Product Manager",
"hire_date": "2017-04-19",
"estimated_hire_date": null,
"matching": {
"employer_name": {
"matched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "edba0b20-22e5-11eb-916b-452b88954927"
}
],
"unmatched_sources": []
}
}
}
]
}

Employment information specific to the applicant whose report is being accessed.

FieldFormatNotes
source_idStringThe identifier for the source that reported the employment information. See sources
source_record_idUUIDThe identifier for an individual record within a source
employer_nameStringName of the applicant's employer
employer_address_line_1StringAddress line 1 where the applicant's employer is located
employer_address_line_2StringAddress line 2 where the applicant's employer is located
employer_cityStringCity where the applicant's employer is located
employer_stateStringState where the applicant's employer is located
employment_typeStringType of employment (contract, parttime or fulltime)
employment_statusStringStatus of the applicant's employment (active or terminated)
job_titleStringTitle of the applicant's job
hire_dateFull DateEmployee hire date as stated on the employment source
estimated_hire_dateFull DateAn estimate of the employee hire date. Only has a non-null value when hire_date is null
matchingObjectSee matching

matching {}

Example employment matching field object for case where there is an employer name match:
{
"matching": {
"employer_name": {
"matched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "5f19d40f-3c19-4a7d-ad7b-cc28dac40c4d"
}
],
"unmatched_sources": []
}
}
}
Example employment matching field object for case where there is no employer name match:
{
"matching": {
"employer_name": {
"matched_sources": [],
"unmatched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "c31bf8c7-c25b-4d2c-a4bc-61f79fd46e65"
}
]
}
}
}

Information about sources which have matching and conflicting values to a particular employment.

matching is returned in an object broken out by field, only certain fields are matched between sources. If only one employment item exists, there will be no matching field. Information about matching sources is stored wrapped in the MatchingField format, which indicates where each value was sourced from.

FieldFormatNotes
employer_nameObjectMatched and unmatched sources for an employer name
MatchingField {}
Example matching field object for case where there is a field match:
{
"matched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "5f19d40f-3c19-4a7d-ad7b-cc28dac40c4d"
}
],
"unmatched_sources": []
}
Example matching field object for case where there is no field match:
{
"matched_sources": [],
"unmatched_sources": [
{
"source_id": "OCROLUS",
"source_record_id": "c31bf8c7-c25b-4d2c-a4bc-61f79fd46e65"
}
]
}

An object containing information about which sources have a matching value for a field and which sources contain conflicting values for the same field. A source is an object containing a source_id and a source_record_id if there are multiple source records.

FieldFormatNotes
matched_sourcesArrayList of sources which have a value that matches this employer. See sources
unmatched_sourcesArrayA list of sources which have a value that conflicts with this employer. See sources

bank_transactions []

Example snippet of bank_transactions in the report response:

{
"bank_transactions": [
{
"source_id": "USA_FIN",
"summary": {
...
},
"account_details": [
...
],
"inflows": {
...
}
}
...
]
...
}

A list of data sourced from bank transactions. Each separate entry in the bank transactions list represents the set of data returned from a single source.

FieldFormatNotes
source_idStringThe identifier for the source that reported the bank transaction information. See sources
summaryObjectSee summary
account_detailsObjectSee account_details
inflowsObjectSee inflows

summary {}

Example snippet of summary within bank_transactions:

{
"bank_transactions": [{
"summary": {
"months_available": 6,
}
}],
}

Summary information specific to the applicant whose report is being accessed. Available if an applicant connects their bank account.

FieldFormatNotes
months_availableIntegerNumber of months of transaction data available on the report

account_details []

Example account detail field object:

{
"bank_transactions": [{
"account_details": [{
"account_id": "36139831-0a91-4d1f-bc3e-edc908a978c6",
"owner_full_name": "John Doe",
"institution_name": "CHASE",
"account_name": "INVESTMENT ACCOUNT",
"account_type": "INVESTMENT",
"date_opened": "2015-05-01",
"oldest_transaction_date": "2015-05-03",
"truncated_account_number": "1234",
"responsibility": "INDIVIDUAL",
"last_statement_end_date": "2015-05-30",
"addresses": [
{
"address_id": "80421b7e-7918-4963-b5fb-85055c2994b7",
"address": "225 Valencia St.",
"street": "Valencia St.",
"city": "San Francisco",
"zipcode": "94103",
"state": "CA"
}
],
"current_balance": 23422,
"routing_number": "123445",
"full_account_number": "789682736",
"attributes": [
{
"name": "EXPENSES_COUNT_3_MONTH_AVG",
"description": "Average count of expenses over the last 3 months",
"node": "EXPENSES",
"source_ids": ["USA_FIN"],
"adverse_action_code": "66",
"value": 10
},
{
"name": "EXPENSES_COUNT_0_50_3_MONTH_AVG",
"description": "Average count of expenses between $0 and $50 over the last 3 months",
"node": "EXPENSES",
"source_ids": ["USA_FIN"],
"adverse_action_code": "67",
"value": 9996
},
...
],
},
...
],
}],
}

An array with each instance containing details about an account. The array can have zero objects, and there is no upper bound.

FieldFormatNotes
account_idUUIDUnique identifier for the account
owner_full_nameStringFull name of the owner of the account
institution_nameStringName of institution such as Chase or Bank of America
account_nameStringName of the account within the bank
account_typeStringType of the account within the bank. See account types
date_openedFull DateDate the account was opened
oldest_transaction_dateFull DateDate of the oldest transaction for the account
truncated_account_numberStringIf available, the last four digits of the account number
responsibilityStringSee responsibility
last_statement_end_dateFull DateEnd date of the of the most recent statement
addressesArraySee addresses
current_balanceFloatCurrent balance of the account
routing_numberStringRouting number of financial institution for the account. Please contact your Nova Credit account representative to enable this field
full_account_numberStringThe full account number for initiating ACH transfers for this account. Please contact your Nova Credit account representative to enable this field
attributesArrayAttributes associated with this account. See attributes
addresses []
Example addresses field array:

{
"addresses": [{
"address_id": "80421b7e-7918-4963-b5fb-85055c2994b7",
"address": "225 Valencia St., San Francisco, CA 94103",
"street": "Valencia St.",
"city": "San Francisco",
"zipcode": "94103",
"state": "CA"
}],
},

Addresses is a history of contact information attached to this account. Addresses are returned in an array, can have zero objects, and there is no upper bound.

FieldFormatNotes
address_idUUIDUnique identifier for the address
addressStringThe full mailing address of the account owner
streetStringThe street address where the account owner is located
neighborhoodStringThe neighborhood where the account owner is located
districtStringThe district where the account owner is located
cityStringThe city where the account owner is located
zipcodeStringThe zip code where the account owner is located
stateStringThe state where the account owner is located

inflows {}

Example inflows field object:

{
"bank_transactions": [{
"inflows": {
"total_annual": 24000,
"total_adjusted_annual": 27600,
"history": [
{
"year": 2019,
"total": [ null, 2000, ... ],
"misc_deposits": [ null, 100, ... ]
},
...
],
},
}],
}

An object containing details about an account. Not included in reports when source_id is PLAID.

FieldFormatNotes
total_annualIntegerRegular deposit streams, aggregated over the last 12 months
total_adjusted_annualIntegerRegular deposit streams, aggregated over the last 12 months, scaled up using net-to-gross tax adjustment
historyArraySee history
history []
Example inflow history field object:

{
"history": [{
"year": 2019,
"total": [ null, 2000, ... ],
"misc_deposits": [ null, 100, ... ]
}]
}

An array with each element containing information about the value of the inflow history.

history is returned in an array of objects (one object per year, from most recent to least). There are multiple histories that the history node reports and are denoted by separate keys in each history object. History arrays will be segmented by month. The first element is the month of December and the last is January. If no data is available for a given month the value will be null.

FieldFormatNotes
yearIntegerThe given history's year
totalArrayAll inflow streams to deposit accounts
misc_depositsArrayNet miscellaneous deposits into accounts

expenses []

Example snippet of expenses in the report response:

{
"expenses": [
{
"history": [
...
]
}
]
}

An array containing details about the applicant's expenses.

FieldFormatNotes
historyArraySee history

history []

Example expenses history field object:

{
"history": [{
"year": 2021,
"count": [
...
],
"count_0_50": [
...
],
"count_50_100": [
...
],
"count_100_250": [
...
],
"count_250_500": [
...
],
"count_500_1000": [
...
],
"count_above_1000": [
...
],
"sum": [
...
],
"sum_0_50": [
...
],
"sum_50_100": [
...
],
"sum_100_250": [
...
],
"sum_250_500": [
...
],
"sum_500_1000": [
...
],
"sum_above_1000": [
...
]
}]
}

An array with each element containing information about the expense history.

history is returned in an array of objects (one object per year, from most recent to least). There are multiple histories that the history node reports and are denoted by separate keys in each history object. History arrays will be segmented by month. The first element is the month of December and the last is January. If no data is available for a given month the value will be null.

For each range, the lower bound is exclusive, and the upper bound is inclusive. For example:

  • The value $49.99 would fall into the range 0_50

  • The value$50.00 would also fall into the range 0_50

  • The value$50.01 would fall into the range 50_100

FieldFormatNotes
yearIntegerThe history's given year
countArrayCount of expenses over a 1 month period
count_0_50ArrayCount of expenses identified as being less than or equal to $50 over a 1 month period
count_50_100ArrayCount of expenses identified as being greater than $50 & less than or equal to $100 over a 1 month period
count_100_250ArrayCount of expenses identified as being greater than $100 & less than or equal to $250 over a 1 month period
count_250_500ArrayCount of expenses identified as being greater than $250 & less than or equal to $500 over a 1 month period
count_500_1000ArrayCount of expenses identified as being greater than $500 & less than or equal to $1000 over a 1 month period
count_above_1000ArrayCount of expenses identified as being above $1000 over a 1 month period
sumArraySum of expenses over a 1 month period
sum_0_50ArraySum of expenses identified as being less than or equal to $50 over a 1 month period
sum_50_100ArraySum of expenses identified as being greater than $50 & less tha or equal to $100 over a 1 month period
sum_100_250ArraySum of expenses identified as being greater than $100 & less than or equal to $250 over a 1 month period
sum_250_500ArraySum of expenses identified as being greater than $250 & less than or equal to $500 over a 1 month period
sum_500_1000ArraySum of expenses identified as being greater than $500 & less than or equal to $1000 over a 1 month period
sum_above_1000ArraySum of expenses identified as being above $1000 over a 1 month period

income {}

Example snippet of incomes in the report response:

{
"income": {
"financial_accounts": [
...
],
"paystubs": [
...
],
"payroll": [
...
]
}
}

Income information specific to the applicant whose report is being accessed. Not included in reports if income information is not found.

FieldFormatNotes
financial_accountsArraySee financial accounts
paystubsArraySee paystubs
payrollArraySee payroll

financial_accounts []

Example snippet of financial_accounts:

{
"income": {
"financial_accounts": [
{
"source_ids": ["USA_FIN"],
"model_version": "0.1.5",
"model_type": "NOVA_INCOME",
"descriptions": ["GUSTO PAY", "NAPOLI PIZZERIA DIR DEP"],
"is_consistent": true,
"net_recent": 20000,
"gross_recent": 24000,
"confidence_score_recent": 90,
"net_annual": 20000,
"gross_annual": 24000,
"confidence_score_annual": 90,
"matched_income": {
"stated_employer": "Napoli Pizzeria",
"stated_annual_income": 18000,
"description": "NAPOLI PIZZERIA USA 6787 836XNLNKSEYCQ8B -",
"net_income": 15480,
"gross_income": 18923,
"confidence_score": 80,
},
"history": [
{
"year": 2019,
"gross": [ 2500, 5000, ... ],
"net": [ 2250, 4500, ... ],
"confidence_score": [90, 90, ...],
},
]
},
]
}
}

Income information derived from financial account data.

FieldFormatNotes
source_idsArrayThe identifiers for the sources that reported the income information. See sources
model_versionStringThe identifier for the income model version
model_typeStringSee model types
descriptionsArrayDescriptions of active inflow streams, ordered by size of inflow stream over the past 3 months (max 3 inflow stream descriptions)
is_consistentBooleanIncome has been received for the last 3 complete months
net_recentIntegerNet (take home) income over the past three complete calendar months annualized
gross_recentIntegerGross income over the past three complete calendar months annualized
confidence_score_recentConfidence ScoreConfidence score for income over past three complete calendar months
net_annualIntegerNet (take home) income over the past twelve complete calendar months
gross_annualIntegerGross income over the past twelve complete calendar months
confidence_score_annualConfidence ScoreConfidence score for income over past twelve complete calendar months
matched_incomeObjectSee matched_income
historyArraySee history
matched_income {}
Example matched income object:

{
"matched_income": {
"stated_employer": "Napoli Pizzeria",
"stated_annual_income": 18000,
"description": "NAPOLI PIZZERIA USA 6787 836XNLNKSEYCQ8B -",
"net_income": 15480,
"gross_income": 18923,
"confidence_score": 80,
}
}

An object that describes the income stream that best matches the stated employer name provided by the applicant. If no income stream matches, this object will be empty.

FieldFormatNotes
stated_employerStringStated employer name provided by the applicant
stated_annual_incomeIntegerStated annual income provided by the applicant
descriptionStringDescription for the matched income stream
net_incomeIntegerNet income for the matched income stream
gross_incomeIntegerGross income for the matched income stream
confidence_scoreConfidence ScoreConfidence score for the matched income stream. This is an indicator of how confidently this matched income represents true income
history []
Example income history field object:

{
"history": [{
"year": 2019,
"gross": [ 2500, 5000, ... ],
"net": [ 2250, 4500, ... ],
"confidence_score": [90, 90, ...],
}],
},

An array with each element containing information about the value of the income history.

history is returned in an array of objects (one object per year, from most recent to least). There are multiple histories that the history node reports and are denoted by separate keys in each history object. History arrays will be segmented by month. The first element is the month of December and the last is January. If no data is available for a given month the value will be null

FieldFormatNotes
yearIntegerThe history's given year
grossArraySums of gross income over 1-month periods. Current month may be partial value
netArraySums of take-home income over 1-month periods. Current month may be partial value
confidence_scoreArrayConfidence score for income over 1-month periods.

paystubs []

Example snippet of paystubs:

{
"income": {
...
"paystubs": [
{
"source_id": "OCROLUS",
"source_record_id": "c33632a0-1d6a-11eb-806e-1f1356d092eb",
"source_filepath": "f3f0d372-a0f7-402f-835e-67ce6db2a75f/866c943a-8e0b-45c6-b381-53712c2809a2.pdf",
"employee_name": "PAYTON STUBBINS",
"employee_address_line_1": "123 FRANKLIN ST",
"employee_address_line_2": "APT 4",
"employee_city": "CHAPEL HILL",
"employee_state": "NC",
"employee_zip": "27517",
"pay_period_start": "2017-07-10",
"pay_period_end": "2017-07-23",
"pay_date": "2017-08-04",
"pay_frequency": "SEMI_MONTHLY",
"paystub_provider": "ADP",
"hire_date": null,
"net_total_earnings_amount_current": "1040.23",
"net_total_earnings_amount_ytd": "18396.25",
"gross_total_earnings_amount_current": "1627.74",
"gross_total_earnings_amount_ytd": "28707.21",
"regular_pay_earnings_amount_current": "1515.84",
"regular_pay_earnings_amount_ytd": "24743.49",
"bonus_earnings_amount_current": "40.69",
"bonus_earnings_amount_ytd": "325.27",
"overtime_earnings_amount_current": "0",
"overtime_earnings_amount_ytd": "442.54",
"commission_earnings_amount_current": null,
"commission_earnings_amount_ytd": null,
"paid_time_off_earnings_amount_current": "0",
"paid_time_off_earnings_amount_ytd": "1459.97",
"vacation_earnings_amount_current": "71.21",
"vacation_earnings_amount_ytd": "952.9",
"paid_time_off_deductions_amount_current": null,
"paid_time_off_deductions_amount_ytd": null,
"vacation_deductions_amount_current": null,
"vacation_deductions_amount_ytd": null,
"medicare_tax_deductions_amount_current": "22.12",
"medicare_tax_deductions_amount_ytd": "394.81",
"social_security_deductions_amount_current": "94.58",
"social_security_deductions_amount_ytd": "1688.15",
"fica_tax_deductions_amount_current": null,
"fica_tax_deductions_amount_ytd": null,
"regular_hours_earnings_current": "74.5",
"regular_rate_earnings_current": "20.35",
"commission_hours_earnings_current": null,
"commission_rate_earnings_current": null,
"overtime_hours_earnings_current": "0",
"overtime_rate_earnings_current": null,
"bonus_hours_earnings_current": "2",
"bonus_rate_earnings_current": "20.35",
"paid_time_off_hours_earnings_current": "0",
"paid_time_off_rate_earnings_current": null,
"vacation_hours_earnings_current": "3.5",
"vacation_rate_earnings_current": "20.35",
"annual_salary_rate": "45000",
"pay_distribution": [
{
"bank_name": "BANK OF NOVA",
"account_number": "0000987654321",
"account_type": "CHECKING",
"pay_amount_current": "1040.23"
}
],
"insights": {
"insights_type": "NOVA_INSIGHTS",
"insights_version": "1.0.0",
"annual_earnings_insight": "45000",
"annual_gross_income": "12345.67",
"annual_net_income": "11234.56"
},
"consistency_checks": {
"START_DATE_BEFORE_END_DATE": {
"boolean_value": true
},
"GROSS_PAY_YTD_GREATER_THAN_OR_EQUAL_TO_GROSS_PAY_CURRENT": {
"boolean_value": true
},
"NET_PAY_LESS_THAN_OR_EQUAL_TO_GROSS_PAY": {
"boolean_value": true
},
"COMPONENT_EARNINGS_LESS_THAN_OR_EQUAL_TO_TOTAL_GROSS_PAY": {
"boolean_value": true
},
"EMPLOYEE_NAME_EXISTS": {
"boolean_value": true
},
"EMPLOYER_NAME_EXISTS": {
"boolean_value": true
},
"START_DATE_IS_VALID_DATE": {
"boolean_value": true
},
"END_DATE_IS_VALID_DATE": {
"boolean_value": true
},
"PAY_DATE_IS_VALID_DATE": {
"boolean_value": true
},
"START_DATE_EXISTS": {
"boolean_value": true
},
"END_DATE_EXISTS":{
"boolean_value": true
},
"PAY_DATE_EXISTS": {
"boolean_value": true
},
"GROSS_TOTAL_EARNINGS_AMOUNT_CURRENT_EXISTS": {
"boolean_value": true
},
"NET_TOTAL_EARNINGS_AMOUNT_CURRENT_EXISTS": {
"boolean_value": true
}
},
"irregularity_detection": {
"status": "DETECTED",
"irregularities": [
{
"type": "unusual_document_source",
"details": [
{
"doc_origin": "Microsoft Office",
},
]
},
{
"type": "page_edited",
"details": [
{
"edit_source": "Adobe Acrobat",
},
]
},
{
"type": "online_generated_paystub",
"details": [
{
"site_name": "www.paystubcreator.net",
},
]
},
{
"type": "dollar_amount_edits",
"details": [
{
"field": "box:amount",
"tampered_text": "10,300.00",
},
{
"field": "box:periodDailyBalance",
"tampered_text": "13,495.00",
"original_text": "3,527.00",
},
]
}
],
"visualizations": [
{
"source_filepath": "f3f0d372-a0f7-402f-835e-67ce6db2a75f/2089b8e9-6fcc-412b-b5e6-c05a34032cf2.png",
"description": "Tampered fields are highlighted in red.",
"type": "tamper_overview"
}
]
},
}
]
},
}

Income information derived from paystub data.

FieldFormatNotes
source_idStringThe identifier for the source that reported the paystub information. See sources
source_record_idUUIDThe identifier for an individual record within a source
source_filepathStringThe file path used for downloading an applicants paystub file
employee_nameStringName of applicant
employee_address_line_1StringAddress line 1 of applicant
employee_address_line_2StringAddress line 2 of applicant
employee_cityStringCity of applicant
employee_stateStringState of applicant
employee_zipStringPostal code of applicant
pay_period_startFull DateStart date of the paystub pay period
pay_period_endFull DateEnd date of the paystub pay period
pay_dateFull DateDate the pay was issued
pay_frequencyStringSee pay_frequency table
paystub_providerStringProvider of paystub
hire_dateFull DateEmployee hire date as stated on the paystub
net_total_earnings_amount_currentStringNet total earnings from current pay period
net_total_earnings_amount_ytdStringNet total earnings from year to date pay period
gross_total_earnings_amount_currentStringGross total earnings from current pay period
gross_total_earnings_amount_ytdStringGross total earnings from year to date pay period
regular_pay_earnings_amount_currentStringRegular (base) pay earnings from current pay period
regular_pay_earnings_amount_ytdStringRegular (base) pay earnings from year to date pay period
bonus_earnings_amount_currentStringBonus earnings from current pay period period
bonus_earnings_amount_ytdStringBonus earnings from year to date pay period
overtime_earnings_amount_currentStringOvertime earnings from current pay period
overtime_earnings_amount_ytdStringOvertime earnings from year to date pay period
commission_earnings_amount_currentStringCommission earnings from current pay period
commission_earnings_amount_ytdStringCommission earnings from year to date pay period
paid_time_off_earnings_amount_currentStringPaid time off earnings from current pay period
paid_time_off_earnings_amount_ytdStringPaid time off earnings from year to date pay period
vacation_earnings_amount_currentStringVacation earnings from current pay period
vacation_earnings_amount_ytdStringVacation earnings from year to date pay period
paid_time_off_deductions_amount_currentStringPaid time off deductions from current pay period
paid_time_off_deductions_amount_ytdStringPaid time off deductions from year to date pay period
vacation_deductions_amount_currentStringVacation deductions from current pay period
vacation_deductions_amount_ytdStringVacation deductions from year to date pay period
medicare_tax_deductions_amount_currentStringMedicare tax deductions from current pay period
medicare_tax_deductions_amount_ytdStringMedicare tax deductions from year to date pay period
social_security_deductions_amount_currentStringSocial security tax deductions from current pay period
social_security_deductions_amount_ytdStringSocial security tax deductions from year to date pay period
fica_tax_deductions_amount_currentStringFICA tax deductions from current pay period
fica_tax_deductions_amount_ytdStringFICA tax deductions from year to date pay period
regular_hours_earnings_currentStringRegular (base) hours earned from current pay period
regular_rate_earnings_currentStringRegular (base) average rate earned from current pay period
commission_hours_earnings_currentStringCommission hours earned from current pay period
commission_rate_earnings_currentStringCommission average rate earned from current pay period
overtime_hours_earnings_currentStringOvertime hours earned from current pay period
overtime_rate_earnings_currentStringOvertime average rate earned from current pay period
bonus_hours_earnings_currentStringBonus hours earned from current pay period
bonus_rate_earnings_currentStringBonus average rate earned from current pay period
paid_time_off_hours_earnings_currentStringPaid time off hours earned from current pay period
paid_time_off_rate_earnings_currentStringPaid time off average rate earned from current pay period
vacation_hours_earnings_currentStringVacation hours earned from current pay period
vacation_rate_earnings_currentStringVacation average rate earned from current pay period
annual_salary_rateStringEmployee annual salary rate as stated on the paystub
pay_distributionArraySee pay_distribution
insightsObjectSee insights
consistency_checksObjectSee consistency_checks
irregularity_detectionObjectSee irregularity_detection
pay_distribution []
Example pay_distribution field object:
[
{
"bank_name": "BANK OF NOVA",
"account_number": "0000987654321",
"account_type": "CHECKING",
"pay_amount_current": "1040.23"
}
]

A list of payment distribution details

FieldFormatNotes
bank_nameStringName of the bank where payment was distributed
account_numberStringThe bank account number
account_typeStringType of bank account. See account types
pay_amount_currentFloatAmount distributed
insights {}
Example insights field object:
{
"insights": {
"insights_type": "NOVA_INSIGHTS",
"insights_version": "1.0.0",
"annual_earnings_insight": "45000",
"annual_gross_income": "12345.67",
"annual_net_income": "11234.56"
}
}

An object containing various insights from the paystub.

FieldFormatNotes
insights_typeStringSee insights types
insights_versionStringThe identifier for the paystub insights version
annual_earnings_insightStringAnnualized income insight based on paystub information, rounded to 2 decimal places
annual_gross_incomeStringAnnualized gross income based on paystub information, rounded to 2 decimal places
annual_net_incomeStringAnnualized net income based on paystub information, rounded to 2 decimal places
consistency_checks {}
Example consistency_checks field object:

{
"consistency_checks": {
"START_DATE_BEFORE_END_DATE": {
"boolean_value": true
},
"GROSS_PAY_YTD_GREATER_THAN_OR_EQUAL_TO_GROSS_PAY_CURRENT": {
"boolean_value": true
},
"NET_PAY_LESS_THAN_OR_EQUAL_TO_GROSS_PAY": {
"boolean_value": true
},
"COMPONENT_EARNINGS_LESS_THAN_OR_EQUAL_TO_TOTAL_GROSS_PAY": {
"boolean_value": true
},
"EMPLOYEE_NAME_EXISTS": {
"boolean_value": true
},
"EMPLOYER_NAME_EXISTS": {
"boolean_value": true
},
"START_DATE_IS_VALID_DATE": {
"boolean_value": true
},
"END_DATE_IS_VALID_DATE": {
"boolean_value": true
},
"PAY_DATE_IS_VALID_DATE": {
"boolean_value": true
},
"START_DATE_EXISTS": {
"boolean_value": true
},
"END_DATE_EXISTS":{
"boolean_value": true
},
"PAY_DATE_EXISTS": {
"boolean_value": true
},
"GROSS_TOTAL_EARNINGS_AMOUNT_CURRENT_EXISTS": {
"boolean_value": true
},
"NET_TOTAL_EARNINGS_AMOUNT_CURRENT_EXISTS": {
"boolean_value": true
}
}
}

An object containing various consistency checks for the paystub. Each check contains an object with a a boolean_value representing whether the check has passed or not.

FieldNotes
START_DATE_BEFORE_END_DATEIndicates whether the start date of the pay period is before the end date of the pay period
GROSS_PAY_YTD_GREATER_THAN_OR_EQUAL_TO_GROSS_PAY_CURRENTIndicates whether the year to date gross earnings are greater than or equal to the gross earnings for the pay period
NET_PAY_LESS_THAN_OR_EQUAL_TO_GROSS_PAYIndicates whether the net earnings or less than or equal to the gross earnings
COMPONENT_EARNINGS_LESS_THAN_OR_EQUAL_TO_TOTAL_GROSS_PAYIndicates whether the sum of the earnings components is less than or equal to the total gross pay
EMPLOYEE_NAME_EXISTSIndicates whether the employee name was able to be determined from the paystub
EMPLOYER_NAME_EXISTSIndicates whether the employer name was able to be determined from the paystub
START_DATE_IS_VALID_DATEIndicates whether the start date of the pay period is an actual date on the Gregorian calendar
END_DATE_IS_VALID_DATEIndicates whether the end date of the pay period is an actual date on the Gregorian calendar
PAY_DATE_IS_VALID_DATEIndicates whether the pay date is an actual date on the Gregorian calendar
START_DATE_EXISTSIndicates whether the start date of the pay period was able to be determined from the paystub
END_DATE_EXISTIndicates whether the end date of the pay period was able to be determined from the paystub
PAY_DATE_EXISTSIndicates whether the pay date was able to be determined from the paystub
GROSS_TOTAL_EARNINGS_AMOUNT_CURRENT_EXISTSIndicates whether the gross total earnings was able to be determined from the paystub
NET_TOTAL_EARNINGS_AMOUNT_CURRENT_EXISTSIndicates whether the net total earnings was able to be determined from the paystub
irregularity_detection {}

The irregularity detection node changes depending on the customer's configured fraud version. Please consult the section for your specific fraud version

Fraud v1 and v2

Example v1 irregularity_detection field object when irregularities are detected:

{
"irregularity_detection": {
"status": "DETECTED",
"irregularities": [
{
"type": "unusual_document_source",
"details": [
{
"doc_origin": "Microsoft Office"
}
]
},
{
"type": "page_edited",
"details": [
{
"edit_source": "Adobe Acrobat"
}
]
},
{
"type": "online_generated_paystub",
"details": [
{
"site_name": "www.paystubcreator.net"
}
]
},
{
"type": "future_date",
"details": [
{
"field": "Paystub Pay Date",
"processed_date": "2023-09-06",
"captured_date": "2023-09-08"
}
]
},
{
"type": "dollar_amount_edits",
"details": [
{
"field": "box:amount",
"tampered_text": "10,300.00"
},
{
"field": "box:periodDailyBalance",
"tampered_text": "13,495.00",
"original_text": "3,527.00"
}
]
}
],
"visualizations": [
{
"source_filepath": "f3f0d372-a0f7-402f-835e-67ce6db2a75f/2089b8e9-6fcc-412b-b5e6-c05a34032cf2.png",
"description": "Tampered fields are highlighted in red.",
"type": "tamper_overview"
}
]
}
}

Example v1/v2 irregularity_detection field object when irregularities are not detected:

{
"irregularity_detection": {
"status": "NOT_DETECTED",
"irregularities": [],
"visualizations": []
}
}

Example v2 irregularity_detection field object when irregularities are not detected:

{
"irregularity_detection": {
"status": "NOT_DETECTED",
"irregularities": [],
"visualizations": [],
"fraud_indication": [
{
"verdict": "TRUSTED",
"file_type": "pdf",
"indicators": "normal_object_sequence_per_document_class,normal_stream_operations,has_trusted_fonts,normal_metadata,is_pdf_unmodified_per_trailer_id",
"reason_label": "Document is genuine and comes from a known issuer",
"reason_value": "TRUSTED_PDF"
}
]
}
}

Example v2 irregularity_detection field object when irregularities are detected:

{
"irregularity_detection": {
"status": "DETECTED",
"irregularities": [
{
"type": "unusual_document_source",
"details": [
{
"doc_origin": "ipsam"
}
]
}
],
"visualizations": [
{
"source_filepath": "aa418d6a-dad5-490f-be7e-e3279a6f222b/74fd69bc-f278-453c-ba9f-bc751e028baf.png",
"description": "Tampered fields are highlighted in red.",
"type": "tamper_overview"
}
]
"fraud_indication": {
"verdict": "WARNING",
"file_type": "image",
"indicators": "screenshot,has_smartphone_header_footer",
"reason_label": "Document created by capturing an image from a device screen",
"reason_value": "SCREENSHOT"
}
}
}

This node will contain details about any irregularities detected.

FieldFormatNotes
statusStringSee irregularity_detection_status values
irregularitiesArraySee irregularities
visualizationsArraySee visualizations
fraud_indicationArray(optional) See fraud_indication
irregularities []
Example irregularities array:

{
"irregularities": [
{
"type": "account_number_edits",
"details": [
...
]
},
...
}

An array with each instance describing a distinct type of irregularity found on the file. This array will be empty unless irregularity_detection.status is DETECTED.

FieldFormatNotes
typeStringSee irregularity types
detailsArraySee details
details []
Example details array when irregularity `type` is `page_edited`:

{
"details": [
{
"edit_source": "Adobe Acrobat",
}
]
}

Example details array when irregularity `type` is `unusual_document_source`:

{
"details": [
{
"doc_origin": "Microsoft Office",
}
]
}

Example details array when irregularity `type` is `online_generated_paystub`:

{
"details": [
{
"site_name": "www.paystubcreator.net",
}
]
}

Example details array when irregularity `type` is `future_date`:

{
"details": [
{
"field": "Paystub Pay Date",
"captured_date": "2023-09-08",
"processed_date": "2023-09-06",
}
]
}

Example details array for all other irregularity `type`s:

{
"details": [
{
"field": "accountInfo:accountHolderName",
"original_text": "George Eliot",
"tampered_text": "Mary Ann Evans"
},
...
]
}

An array with each instance describing a distinct instance of an irregularity found on the file. There are 3 possible object shapes in this array, depending on the irregularity type it represents.

FieldFormatNotes
fieldString(optional) The name of the field that has been edited
original_textString(optional) The recovered text that was originally on the document
tampered_textString(optional) The text that now appears on the document
edit_sourceString(optional) Present when irregularity type is page_edited. The name of the software used to edit the page
doc_originString(optional) Present when irregularity type is unusual_document_source. The original source of the document
site_nameString(optional) Present when irregularity type is online_generated_paystub. The site used to generate the document
processed_dateString(optional) Present when irregularity type is future_date. The processing date of the document
captured_dateString(optional) Present when irregularity type is future_date. The captured date of the document
processed_yearString(optional) Present when irregularity type is future_year. The processing year of the document
captured_yearString(optional) Present when irregularity type is future_year. The captured year of the document
visualizations []
Example snippet of visualizations:

{
"visualizations": [
{
"source_filepath": "f3f0d372-a0f7-402f-835e-67ce6db2a75f/2089b8e9-6fcc-412b-b5e6-c05a34032cf2.png",
"description": "Tampered fields are highlighted in red.",
"type": "tamper_overview"
},
...
]
}

An array of irregularity visualization metadata objects. This array will be empty unless irregularity_detection.status is DETECTED.

FieldFormatNotes
source_filepathStringThe file path used for downloading the visualizations file
descriptionStringA human-readable description of the visualized fraud signal and guidance on how to interpret it
typeStringThe type of file tampering visualization offered in this image
fraud_indication []
Example snippet of fraud_indication:

{
"fraud_indication": [
{
"verdict": "TRUSTED",
"file_type": "pdf",
"indicators": "normal_object_sequence_per_document_class,normal_stream_operations,has_trusted_fonts,normal_metadata,is_pdf_unmodified_per_trailer_id",
"reason_label": "Document is genuine and comes from a known issuer",
"reason_value": "TRUSTED_PDF"
},
...
]
}

fraud_indication is an alternative / augmentative service to irregularities. They can be returned alone or alongside the detected irregularities.

FieldFormatNotes
verdictStringSee fraud_indication_verdict values
file_typeStringSee fraud_indication_file_type values
indicatorsStringA comma-separated string of specific positive/negative fraud indicators found in the file
reason_labelStringPlaintext description for the reason_value
reason_valueStringMore specific reason for the verdict value
Fraud v3

If Irregularity Detection is enabled, this node will contain details about any irregularities detected.

FieldFormatNotes
statusStringSee irregularity_detection_status values
reasonsArraySee irregularity_detection_reasons values
file_typeStringSee irregularity_detection_file_types values
genuine_pdfBooleanTrue only if document is exceptionally genuine, not provided otherwise
versionStringThe version of the fraud algorithm used to generate the results

Example irregularity_detection field with status NOT_DETECTED and the genuine_pdf flag:

{
"irregularity_detection": {
"status": "NOT_DETECTED",
"reasons": [],
"file_type": "pdf",
"genuine_pdf": true,
"version": "3.0"
}
}

Example irregularity_detection field with status REVIEW:

{
"irregularity_detection": {
"status": "REVIEW",
"reasons": [
{
"reason": "Edited Content Detected",
"severity": "Low Risk"
}
],
"file_type": "pdf",
"version": "3.0"
}
}

Example irregularity_detection field with status DETECTED and multiple reasons:

{
"irregularity_detection": {
"status": "DETECTED",
"reasons": [
{
"reason": "Edited Content Detected",
"severity": "High Risk"
},
{
"reason": "Unusual Document Source Detected",
"severity": "Medium Risk"
}
],
"file_type": "pdf",
"version": "3.0"
}
}
irregularity detection reasons []

Specific reasons supporting the provided irregularity_detection status.

FieldFormatNotes
reasonStringSee the irregularity_detection_reason table
severityStringSee the irregularity_detection_severity table

payroll []

Example snippet of payroll:

{
"income": {
...
"payroll": [
{
"source_id": "USA_ATOMIC",
"provider_name": "ADP",
"annual_income": 45000.54,
"annual_salary_rate": 45000.54,
"estimated_gross_annual_income": 47500.38,
"estimated_net_annual_income": 30000.12,
"pay_frequency": "WEEKLY",
"pay_period_start": "2020-06-13",
"pay_period_end": "2020-06-27",
"statements": [
{
"source_id": "USA_ATOMIC",
"pay_date": "2020-06-30",
"gross_total_earnings_amount_current": 1225,
"gross_total_earnings_amount_ytd": 13625,
"net_total_earnings_amount_current": 840,
"net_total_earnings_amount_ytd": 8840
},
{
"source_id": "USA_ATOMIC",
"pay_date": "2020-06-15",
"gross_total_earnings_amount_current": 1175,
"gross_total_earnings_amount_ytd": 12400,
"net_total_earnings_amount_current": 800,
"net_total_earnings_amount_ytd": 8000
}
]
}
]
}
}

Income information derived from payroll data.

FieldFormatNotes
source_idStringThe identifier for the source that reported the payroll information. See sources
provider_nameStringName of the provider of payroll
annual_incomeFloatDeprecated. Use annual_salary_rate or estimated_gross_annual_income instead.
annual_salary_rateFloatEmployee annual salary rate as reported by the payroll provider. Will be null if not provided
estimated_gross_annual_incomeFloatEstimate of the gross annual income
estimated_net_annual_incomeFloatEstimate of the net annual income
pay_period_startFull DateStart date of the payroll pay period
pay_period_endFull DateEnd date of the payroll pay period
pay_frequencyStringSee pay_frequency table
statementsArraySee statements
statements []
Example statements field object:
[
{
"source_id": "USA_ATOMIC",
"pay_date": "2020-06-15",
"gross_total_earnings_amount_current": 1175,
"gross_total_earnings_amount_ytd": 12400,
"net_total_earnings_amount_current": 800,
"net_total_earnings_amount_ytd": 8000
}
]

A list of statement details

FieldFormatNotes
source_idStringThe identifier for the source that reported the payroll information. See sources
pay_dateFull DateDate the pay was issued
gross_total_earnings_amount_currentFloatGross total earnings from current pay period
gross_total_earnings_amount_ytdFloatGross total earnings from year to date pay period
net_total_earnings_amount_currentFloatNet total earnings from current pay period
net_total_earnings_amount_ytdFloatNet total earnings from year to date pay period

metrics []

Example snippet of metrics in the report response:

{
"metrics": [
{
"source_ids": ["USA_FIN"],
"metric_status": "AVAILABLE",
"metric_source": "NOVA",
"metric_name": "AVG_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHS",
"metric_value": 3200,
"metric_label": "Average of Net on Financial Accounts Last 6 Months",
"metric_format": "NUMERIC",
"metric_type": "CURRENCY"
},
{
"source_ids": ["USA_FIN"],
"metric_status": "AVAILABLE",
"metric_source": "NOVA",
"metric_name": "MIN_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHS",
"metric_value": 500,
"metric_label": "Minimum of Net on Financial Accounts Last 6 Months",
"metric_format": "NUMERIC",
"metric_type": "CURRENCY"
},
...
],
}

Metrics are analytical values derived from the underlying data in the report. metrics are returned in an array and are of configurable length; the array can have zero objects, and there is no upper bound.

Not all sources include metrics. Bank transaction sources will include these metrics in every response:

  • TREND_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHS
  • AVG_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHS
  • MIN_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHS
  • MAX_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHS

It is possible that you will want to reconfigure these metrics after your initial integration with our API; please consider an approach that permits adding and removing metrics without incurring additional integration work. If you have configured customized metrics, or intend to in the future, please contact your Nova Credit Representative for additional examples, details, and advice. It is particularly important that you discuss the mechanics of your metric integration if it relies on a fixed ordering or maximum number of metrics.

Note that if attributes are enabled, metrics will not be available in the report response.

FieldFormatNotes
source_idsArrayA list of ids of the sources utilized to generate this metric. See sources
metric_nameStringSee metric_name
metric_valueNumber/BooleanValue of the metric. Can be numeric or a boolean value.
metric_statusStringSee metric_status
metric_sourceStringSee metric_source
metric_labelStringSee metric_label
metric_typeStringSee metric_type
metric_formatStringSee metric_format

attributes []

info

Please note that this feature is only available for select customers. Contact your Nova Credit Representative to learn more. Note that if attributes are enabled, metrics will not be available in the report response.

Example snippet of attributes in the report response:

{
"attributes": [
{
"name": "ASSETS_CASH_EQUIVALENT_BALANCE",
"description": "Current cash equivalent balance on assets",
"node": "ASSETS",
"source_ids": ["USA_FIN"],
"value": 3200,
"adverse_action_code": "21"
},
{
"name": "ASSETS_CURRENT_RATIO",
"description": "Current ratio on assets",
"node": "ASSETS",
"source_ids": ["USA_FIN"],
"value": 9999998,
"adverse_action_code": "25"
},
...
],
}

Attributes are analytical values derived from the underlying data in the report. attributes are returned in an array; the array can have zero objects, and there is no upper bound. Please consider an approach that permits adding and removing attributes without incurring additional integration work. It is particularly important that you discuss the mechanics of your attributes integration if it relies on a fixed ordering or maximum number of attributes.

Attributes exist at the account level applicable to only the data for a specific connected account or at the aggregate report level consolidated across all connected accounts.

FieldFormatNotes
nameStringThe name of the attribute
descriptionStringHuman readable description of the attribute
nodeStringSee node_type
source_idsArrayA list of IDs of the sources utilized to generate this attribute. See sources
valueNumberValue of the attribute. See value types
adverse_action_codeStringSee adverse_action_codes

Calculations

This service retrieves up to two years of transaction history for the consumer’s provided accounts. This data is grouped based on the transaction posted date and used to generate attributes. This grouping is used to determine which data points will be used to calculate an attribute that is bound by a time frame. If an explicit time frame is given, then the data used to compute the attribute will only include data points for past complete months.

For example, an attribute that calculates the average number of expense transactions over a 12 month period when the consumer completed the application on February 17, 2022 will only include data points between January 1, 2021 to January 31, 2022 inclusive.

In the event an attribute calculation results in an infinite or undefined number, such as dividing by 0, a cap value will be returned.

CalculationFormatNotes
AverageIntegerThe average value over the specified duration
MinimumIntegerThe minimum value over the node's history over the specified duration
MaximumIntegerThe maximum value over the node's history over the specified duration
TrendIntegerCalculate the slope of the values over the specified duration
SumIntegerThe sum of all values over the specified duration
RatioFloatThe ratio between two different sets of data
CountIntegerThe number of occurrences a qualification nis met over the specified duration
BooleanBooleanTrue or false
RecencyIntegerCounts the number of days that fit the given qualification over the specified duration
BalanceFloatCalculate the dollar amount balance over the specified duration. Only two places after the decimal are returned

Default Condition Values

In the case that an attribute could not be calculated, an integer value will be returned indicating one of three scenarios. See Value Types for a table on values based on type.

ConditionDescription
No usable recordsNo relevant records were found for the given node type. This typically occurs in scenarios such as when the user did not connect any accounts or no transactions were found across all connected accounts
No usable records in the categoryRecords exist for the node, but not for the attribute's sub category
No usable valuesRecords exist for the node and category, but the records do not match a constraint such as time frame

Value Types

TypeMinimum ValueMaximum ValueCap ValueNo Usable RecordsNo Usable records in the CategoryNo Usable Values
Boolean015876
Dollar Amounts-9,999,999.999,999,994.999,999,9959,999,9989,999,9979,999,996
Float-9,999,999.999999,999,994.999999,999,9959,999,9989,999,9979,999,996
Short Integer-9,9999,99949,9959,9989,9979,996
Long Integer-9,999,9999,999,9949,999,9959,999,9989,999,9979,999,996

adverse_action_codes []

adverse_action_codes give information about the key factors that affect the consumer’s score. The requirement for lenders to send adverse action notices is a part of the Fair Credit Reporting Act (FCRA), a federal law that promotes accuracy, fairness, and privacy of information.

adverse_action_codes are returned in an array of objects. Each attribute maps to one specific adverse action code, and the adverse_action_codes array will only contain the codes that are associated with attributes found in the attributes node of the API response.

This node will be visible only if the attributes node is enabled.

FieldFormatNotes
codeStringNumeric code between 00 and 100, exclusive. Reach out to your Nova representative to retrieve the values of each code.
descriptionStringHuman readable description

Tables

account_type

Values of the account_type field.

Value
CHECKING
SAVINGS
INVESTMENT
MONEY_MARKET
OTHER

inquiry_type

The human-readable labels are shown when creating and viewing products in the Nova Credit Dashboard. The value column shows the values that are returned in the JSON.

Human-readable labelValue
MonitoringMONITORING
Credit CardCREDIT_CARD
Vehicle AutoVEHICLE_AUTO
Vehicle OtherVEHICLE_OTHER
MortgageMORTGAGE
PersonalPERSONAL
StudentSTUDENT
UtilityUTILITY
CommercialCOMMERCIAL
ConsumerCONSUMER
Tenant ScreeningTENANT
OtherOTHER

metric_name

Values of the metric_name field. To configure the set of metrics provided in your API response or to request additional custom metrics, contact your Nova Credit Representative. This list should be considered non-exhaustive and may be expanded in the future.

NameLabel
TREND_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHSMost recent monthly history value minus the oldest monthly history value within the previous six months
AVG_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHSAverage monthly history value based on history array observations within the previous six months
MIN_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHSMinimum monthly history value based on history array observations within the previous six months
MAX_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHSMaximum monthly history value based on history array observations within the previous six months

metric_status

Values of the metric_status field.

ValueDescription
AVAILABLEMetric is available for this report
UNAVAILABLE_REPORTMetric is unavailable for this report due to lack of underlying data

metric_source

Values of the metric_source field.

ValueDescription
NOVAThis data was calculated from the report data by Nova Credit

metric_label

Values of the metric_label field. See metric_name

metric_type

Values of the metric_type field.

ValueDescription
INTEGERThis data is an integer
CURRENCYThis data is a currency
BOOLEANThis data is a boolean

metric_format

Values of the metric_format field.

ValueDescription
NUMERICThis data is an individual numeric value

model_type

Values of the model_type field.

ValueDescription
NOVA_INCOMEThe Nova Credit Income Model

node_type

Select top level nodes from the report body that are associated with an attribute. At this time, not all node types may be available at the top level of the report. Certain category of attributes will belong to one of the existing node types.

ValueCategories
ASSETSCash equivalent accounts, investment accounts
DEBTSReal estate, installment accounts, revolving, other accounts, short term, overdraft
EXPENSESNSFs (Non-sufficient funds)
INCOMENet income, cash flow

insights_type

Values of the insights_type field.

ValueDescription
NOVA_INSIGHTSThe Nova Credit Insights

pay_frequency

Values of the pay_frequency field.

Value
null
MONTHLY
BI_WEEKLY
WEEKLY
SEMI_MONTHLY

Fraud v1 and v2

irregularity_detection_status

Values of the status field in the v1/v2 irregularity_detection node. Derived from irregularities, fraud_indication, or both if both are enabled.

ValueDescription
NOT_DETECTEDNo irregularities or fraud indications were detected on the file
DETECTEDIrregularities or fraud indications detected, and will be described in the irregularities, visualizations, or fraud_indication subnodes
REVIEWMinor fraud indications detected, manual review recommended
TIMED_OUTIrregularity detection did not complete in time for report compilation
DATA_SUPPLIER_ERRORThere was an error while running irregularity detection

irregularity_type

Possible values of the type field in the irregularities subnode.

ValueNote
page_editedWill result in a unique details object shape
unusual_document_sourceWill result in a unique details object shape
online_generated_paystubWill result in a unique details object shape
account_number_edits
employee_taxpayer_id_edits
employer_id_edits
account_holder_edits
employer_name_edits
account_holder_address_edits
employer_address_edits
account_type_edits
employee_name_edits
employee_address_edits
dollar_amount_edits
earnings_edits
deductions_edits
withholdings_edits
date_edits
transaction_description_edits
pay_frequency_edits
other_edits
employee_details_edits
future_date
suspicious_address
suspected_template

fraud_indication_verdict

Possible values of the verdict field in the fraud_indication subnode.

ValueDescription
NORMALNo particular reason to trust or distrust document
TRUSTEDReasons to trust document have been identified
WARNINGDocument is more likely to have been modified (such as a scanned document)
HIGH_RISKDocument modifications were identified that are frequently associated with fraud or forgery attempts

fraud_indication_file_type

Possible values of the file_type field in the fraud_indication subnode.

Value
pdf
image
unsupported

Fraud v3

irregularity_detection_status

Values of the status field in the v3 irregularity_detection node.

ValueDescription
NOT_DETECTEDNo irregularities were detected on the file
DETECTEDIrregularities were detected on the file
REVIEWMinor fraud indications detected, manual review recommended

irregularity_detection_file_type

Values of the file_type field in the irregularity_detection node.

Value
pdf
image
unsupported

irregularity_detection_reason

Values of the reason field in the v3 irregularity_detection reasons node.

Value
Serial Fraud Detected
Edited Content Detected
Suspicious Modification Detected
Browser/Os Processed
No Textual Document Detected
Unusual Document Source Detected
Screenshot Detected
PDF/Image Converted
Suspicious Format Detected
Editing Software Detected
Others

irregularity_detection_severity

Values of the severity field in the v3 irregularity_detection reasons node.

Value
High Risk
Medium Risk
Low Risk

source_type

Values of the source_type field.

ValueDescription
BANK_TRANSACTIONData was sourced from a bank connection
EMPLOYMENTData was sourced from an uploaded paystub
PAYROLLData was sourced from a payroll provider
CONSUMER_INPUTData was manually entered by the applicant

substatus

Additional insight on certain cases that occur when fetching or parsing a report.

These substatuses may accompany a report with a SUCCESS status:

ValueDescription
ACCOUNT_TOO_NEWThe account linked does not have any inflow transactions that are older than 3 months.
NO_RECENT_USABLE_INFORMATIONThere are no transactions or accounts for this report. The income node will not be attached.
NO_USABLE_INCOME_INFORMATIONThere are no income streams for this report with sufficient confidence scores or the income data cannot be grouped into streams. The income node will not be attached.

These substatuses may accompany a webhook with an ERROR status:

ValueDescription
MFA_REQUIRED_ON_FETCHThe bank account the user tried to connect to requires multi-factor authentication and may depend on the user's browser security settings.
INCOMPATIBLE_ACCOUNT_TYPES_SUBMITTEDThe user only submitted debt accounts (e.g. credit card).
INCOMPLETE_INFORMATIONThe source did not provide critical fields
INVALID_PREFILLS_PII_MISSINGMust provide all required prefill fields.
INVALID_PREFILL_ADDRESSThe address sent via prefill must be a string with max length 100 and contain a valid street address.
INVALID_PREFILL_CITYThe city sent via prefill must be a string with max length 100.
INVALID_PREFILL_DOBThe birthday sent via prefill is missing or not in YYYY-MM-DD format.
INVALID_PREFILL_EMAILThe email sent via prefill must be a valid email with max length 100.
INVALID_PREFILL_FIRST_NAMEThe first name sent via prefill must be a string less than 255 characters and contain only alphabetical, unicode, dots, apostraphes and dashes.
INVALID_PREFILL_LAST_NAMEThe last name sent via prefill must be a string less than 255 characters and contain only alphabetical, unicode, dots, apostraphes and dashes.
INVALID_PREFILL_INCOMEThe stated annual income sent via prefill must be an integer between 0 and 2147483647.
INVALID_PREFILL_PHONEThe phone number sent via prefill must be a string with max length 255.
INVALID_PREFILL_STATEThe state sent via prefill is missing or not in a valid two letter US state or territory code.
INVALID_PREFILL_ZIPThe zip code sent via prefill must a string with a valid USA zip code.

These substatuses may accompany a webhook with a NON_CONTRIBUTING_APPLICANT status:

ValueDescription
COAPPLICANT_GUARANTOR_PROVIDINGThe applicant selected to not contribute income because their co-applicant or guarantor will provide income instead.

responsibility

Values of the responsibility field.

ValueDescription
INDIVIDUALThe individual is solely responsible for the account
JOINTThe individual is jointly responsible for the account

Cash Atlas Response

This is a sample response of the Cash Atlas report. Not all possible data values are present.

{
"meta": {
"user_args": "22bbd586-12b9-4876-8ec0-d210d081f4a1|email@test.com",
"created_at": "2020-04-07T00:53:43.829Z",
"api_version": "4.6.93",
"public_token": "e3f60d3a-8a22-4940-9d1e-50f4f9878503"
},
"product": {
"product_id": "c3a37c41-7c62-11e7-8141-19157d9a48c7",
"name": "Pascoe Gardens Sandbox",
"inquiry_type": "TENANT"
},
"sources": [
{
"source_id": "USA_FIN",
"source_type": "BANK",
"status": "SUCCESS"
},
{
"source_id": "CONSUMER_INPUT",
"source_type": "MANUAL",
"status": "SUCCESS"
}
],
"identities": [{
"source_id": "CONSUMER_INPUT",
"first_name": "Raymond",
"last_name": "Marshal",
"emails": ["raymond@email.com"]
}],
"employment": [
{
"source_id": "OCROLUS",
"employer_name": "NAPOLI PIZZERIA",
"employer_legal_name": "NAPOLI PIZZERIA INC",
"employer_address_line_1": "1 Pepperoni Way",
"employer_address_line_2": null,
"employer_city": "Redmond",
"employer_state": "Washington",
"employment_type": "fulltime",
"employment_status":"active"
"job_title": "Product Manager",
"hire_date": null,
}
],
"bank_transactions": [{
"summary": {
"source_id": "USA_FIN",
"months_available": 6
},
"account_details": [{
"account_id": "36139831-0a91-4d1f-bc3e-edc908a978c6",
"owner_full_name": "John Doe",
"institution_name": "CHASE",
"account_name": "INVESTMENT ACCOUNT",
"account_type": "INVESTMENT",
"date_opened": "2015-05-01",
"oldest_transaction_date": "2015-05-03",
"truncated_account_number": "1234",
"responsibility": "INDIVIDUAL",
"last_statement_end_date": "2015-05-30",
"addresses": [
{
"address_id": "80421b7e-7918-4963-b5fb-85055c2994b7",
"address": "225 Valencia St.",
"street": "Valencia St.",
"city": "San Francisco",
"zipcode": "94103",
"state": "CA"
}
],
"current_balance": 45971,
"routing_number": "98164521",
"full_account_number": "01885674",
"attributes": [
{
"name": "EXPENSES_COUNT_3_MONTH_AVG",
"description": "Average count of expenses over the last 3 months",
"node": "EXPENSES",
"source_ids": ["USA_FIN"],
"adverse_action_code": "66",
"value": 10
},
{
"name": "EXPENSES_COUNT_0_50_3_MONTH_AVG",
"description": "Average count of expenses between $0 and $50 over the last 3 months",
"node": "EXPENSES",
"source_ids": ["USA_FIN"],
"adverse_action_code": "67",
"value": 9996
},
...
],
}],
"inflows": {
"total_annual": 24000,
"total_adjusted_annual": 27600,
"history": [
{
"year": 2019,
"total": [ null, 2000, ... ],
"misc_deposits": [ null, 100, ... ]
},
],
},
}],
"expenses": [{
"history": [
{
"year": 2019,
"count": [ null, null, null, null, null, null, 1, 2, 3, 1, 1, 1 ],
"count_0_50": [ null, null, null, null, null, null, 0, 0, 0, 0, 0, 0 ],
"count_50_100": [ null, null, null, null, null, null, 0, 0, 1, 0, 0, 0 ],
"count_100_250": [ null, null, null, null, null, null, 0, 0, 0, 0, 0, 0 ],
"count_250_500": [ null, null, null, null, null, null, 0, 1, 0, 0, 0, 0 ],
"count_500_1000": [ null, null, null, null, null, null, 0, 0, 0, 0, 0, 0 ],
"count_above_1000": [ null, null, null, null, null, null, 1, 1, 2, 1, 1, 1 ],
"sum": [ null, null, null, null, null, null, 1056, 1456, 2942, 1056, 1056, 1056 ],
"sum_0_50": [ null, null, null, null, null, null, 0, 0, 0, 0, 0, 0 ],
"sum_50_100": [ null, null, null, null, null, null, 0, 0, 70, 0, 0, 0 ],
"sum_100_250": [ null, null, null, null, null, null, 0, 0, 0, 0, 0, 0 ],
"sum_250_500": [ null, null, null, null, null, null, 0, 400, 0, 0, 0, 0 ],
"sum_500_1000": [ null, null, null, null, null, null, 0, 0, 0, 0, 0, 0 ],
"sum_above_1000": [ null, null, null, null, null, null, 1056, 1056, 2872, 1056, 1056, 1056 ],
},
],
}],
"income": {
"financial_accounts": [
{
"source_ids": ["USA_FIN"],
"model_version": "0.1.5",
"model_type": "NOVA_INCOME",
"descriptions": ["GUSTO PAY", "NAPOLI PIZZERIA DIR DEP"],
"is_consistent": true,
"net_recent": 20000,
"gross_recent": 24000,
"confidence_score_recent": 90,
"net_annual": 20000,
"gross_annual": 24000,
"confidence_score_annual": 90,
"matched_income": {
"stated_employer": "Napoli Pizzeria",
"stated_annual_income": 18000,
"description": "NAPOLI PIZZERIA USA 6787 836XNLNKSEYCQ8B -",
"net_income": 15480,
"gross_income": 18923,
"confidence_score": 80,
},
"history": [
{
"year": 2019,
"gross": [ 2500, 5000, ... ],
"net": [ 2250, 4500, ... ],
"confidence_score": [90, 90, ...],
},
]
},
],
"paystubs": [
{
"source_id": "OCROLUS",
"source_record_id": "c33632a0-1d6a-11eb-806e-1f1356d092eb",
"source_filepath": "f3f0d372-a0f7-402f-835e-67ce6db2a75f/866c943a-8e0b-45c6-b381-53712c2809a2",
"employee_name": "JOHN DOE",
"employee_address_line_1": "123 FRANKLIN ST",
"employee_address_line_2": "APT 4",
"employee_city": "CHAPEL HILL",
"employee_state": "NC",
"employee_zip": "27517",
"pay_period_start": "2017-07-10",
"pay_period_end": "2017-07-23",
"pay_date": "2017-08-04",
"pay_frequency": "SEMI_MONTHLY",
"paystub_provider": "ADP",
"hire_date": null,
"net_total_earnings_amount_current": "1040.23",
"net_total_earnings_amount_ytd": "18396.25",
"gross_total_earnings_amount_current": "1627.74",
"gross_total_earnings_amount_ytd": "28707.21",
"regular_pay_earnings_amount_current": "1515.84",
"regular_pay_earnings_amount_ytd": "24743.49",
"bonus_earnings_amount_current": "40.69",
"bonus_earnings_amount_ytd": "325.27",
"overtime_earnings_amount_current": "0",
"overtime_earnings_amount_ytd": "442.54",
"commission_earnings_amount_current": null,
"commission_earnings_amount_ytd": null,
"paid_time_off_earnings_amount_current": "0",
"paid_time_off_earnings_amount_ytd": "1459.97",
"vacation_earnings_amount_current": "71.21",
"vacation_earnings_amount_ytd": "952.9",
"paid_time_off_deductions_amount_current": null,
"paid_time_off_deductions_amount_ytd": null,
"vacation_deductions_amount_current": null,
"vacation_deductions_amount_ytd": null,
"medicare_tax_deductions_amount_current": "22.12",
"medicare_tax_deductions_amount_ytd": "394.81",
"social_security_deductions_amount_current": "94.58",
"social_security_deductions_amount_ytd": "1688.15",
"fica_tax_deductions_amount_current": null,
"fica_tax_deductions_amount_ytd": null,
"regular_hours_earnings_current": "74.5",
"regular_rate_earnings_current": "20.35",
"commission_hours_earnings_current": null,
"commission_rate_earnings_current": null,
"overtime_hours_earnings_current": "0",
"overtime_rate_earnings_current": null,
"bonus_hours_earnings_current": "2",
"bonus_rate_earnings_current": "20.35",
"paid_time_off_hours_earnings_current": "0",
"paid_time_off_rate_earnings_current": null,
"vacation_hours_earnings_current": "3.5",
"vacation_rate_earnings_current": "20.35",
"annual_salary_rate": "45000",
"pay_distribution": [
{
"bank_name": "BANK OF NOVA",
"account_number": "0000987654321",
"account_type": "CHECKING",
"pay_amount_current": "1040.23"
}
],
"insights": {
"insights_type": "NOVA_INSIGHTS",
"insights_version": "1.0.0",
"annual_earnings_insight": "45000"
},
"consistency_checks": {
"START_DATE_BEFORE_END_DATE": {
"boolean_value": true
},
"GROSS_PAY_YTD_GREATER_THAN_OR_EQUAL_TO_GROSS_PAY_CURRENT": {
"boolean_value": true
},
"NET_PAY_LESS_THAN_OR_EQUAL_TO_GROSS_PAY": {
"boolean_value": true
},
"COMPONENT_EARNINGS_LESS_THAN_OR_EQUAL_TO_TOTAL_GROSS_PAY": {
"boolean_value": true
},
"EMPLOYEE_NAME_EXISTS": {
"boolean_value": true
},
"EMPLOYER_NAME_EXISTS": {
"boolean_value": true
},
"PAY_DATE_EXISTS": {
"boolean_value": true
},
"GROSS_TOTAL_EARNINGS_AMOUNT_CURRENT_EXISTS": {
"boolean_value": true
},
"NET_TOTAL_EARNINGS_AMOUNT_CURRENT_EXISTS": {
"boolean_value": true
}
},
"irregularity_detection": {
"status": "DETECTED",
"irregularities": [
{
"type": "unusual_document_source",
"details": [
{
"doc_origin": "Microsoft Office",
},
]
},
{
"type": "page_edited",
"details": [
{
"edit_source": "Adobe Acrobat",
},
]
},
{
"type": "dollar_amount_edits",
"details": [
{
"field": "box:amount",
"tampered_text": "10,300.00",
},
{
"field": "box:periodDailyBalance",
"tampered_text": "13,495.00",
"original_text": "3,527.00",
},
]
}
],
"visualizations": [
{
"source_filepath": "f3f0d372-a0f7-402f-835e-67ce6db2a75f/2089b8e9-6fcc-412b-b5e6-c05a34032cf2.png",
"description": "Tampered fields are highlighted in red.",
"type": "tamper_overview"
}
]
}
}
]
},
"metrics": [
{
"source_ids": ["USA_FIN"],
"metric_status": "AVAILABLE",
"metric_source": "NOVA",
"metric_name": "AVG_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHS",
"metric_value": 3200,
"metric_label": "Average of Net on Financial Accounts Last 6 Months",
"metric_format": "NUMERIC",
"metric_type": "CURRENCY"
},
{
"source_ids": ["USA_FIN"],
"metric_status": "AVAILABLE",
"metric_source": "NOVA",
"metric_name": "MIN_INCOME_FINANCIAL_ACCOUNTS_NET_LAST_6_MONTHS",
"metric_value": 500,
"metric_label": "Minimum of Net on Financial Accounts Last 6 Months",
"metric_format": "NUMERIC",
"metric_type": "CURRENCY"
},
],
"attributes": [
{
"name": "EXPENSES_COUNT_3_MONTH_AVG",
"description": "Average count of expenses over the last 3 months",
"node": "EXPENSES",
"source_ids": ["USA_FIN"],
"adverse_action_code": "66",
"value": 10
},
{
"name": "EXPENSES_COUNT_0_50_3_MONTH_AVG",
"description": "Average count of expenses between $0 and $50 over the last 3 months",
"node": "EXPENSES",
"source_ids": ["USA_FIN"],
"adverse_action_code": "67",
"value": 9996
},
...
],
}

Error Codes & Responses

At Nova Credit, we distinguish between two status message deliveries:

  1. Delivered by Nova Credit to the webhook
  2. If you call a resource endpoint Nova Credit provides a status in the response

Resource Endpoint Errors

When an error occurs while calling the endpoints the Nova Credit servers send back a JSON object with the following format:

{
error: "UNKNOWN_CUSTOMER",
terminated: true,
}

Error Codes

The Nova Credit endpoints return the following HTTP status codes and error messages:

CodeTextDescription
200-The request was successful.
400MALFORMED_HEADERSThe request headers are incorrectly formatted
400MISSING_INPUTAn input is missing that the endpoint expected
400INVALID_PUBLIC_IDThe public ID is not valid
401EXPIRED_TOKENThe access_token you're sending in the request headers has expired. Please request a new one
403UNKNOWN_CUSTOMERThe public_id or client_id Nova Credit received in the request from is not recognized. Check your credentials in the Nova Credit Dashboard.
403UNAUTHORIZEDThe client_id and secret_key combination is not recognized. Check your credentials in the Nova Credit Dashboard.
403ORIGIN_UNAUTHORIZEDThe origin of the request is not whitelisted on the Nova Credit servers for CORS
404INVALID_EXTERNAL_IDThe external ID is not valid
404INVALID_TOKENThe public_token or access_token is not valid for reasons other than expiration
408REQUEST_TIMEOUTThe request timed out
500INTERNAL_ERRORSomething went wrong. Please send a note to your Nova Credit Representative with additional details so we can investigate

Changelog

We're always working to improve the Nova Credit platform! Here's a snapshot of API features we're shipping and bugs we're squashing.

Changelog History

February 2025

  • Fixed bug where identities[].matching.full_name source for an OCROLUS source was missing the source_record_id

December 2024

  • Add fraud v3 schema to irregularity_detection
  • Add last_statement_end_date to account_details.
  • Added source_record_id field to employment and identities node

November 2024

  • Add INVALID_PREFILL_* substatuses for ERROR webhooks
  • Added external_id to report meta

October 2024

  • Fix documentation of income.paystubs[] numeric fields as String not Float

September 2024

  • Added EXPIRED status for Webhooks and way to simulate in sandbox

August 2024

  • Replaced INVALID_DATE_FORMAT_SUBMITTED with INVALID_PREFILL_DOB in substatus table

August 2024

  • Added START_DATE_IS_VALID_DATE, END_DATE_IS_VALID_DATE, PAY_DATE_IS_VALID_DATE, START_DATE_EXISTS, and END_DATE_EXISTS consistency checks

July 2024

  • Added instructions on testing the BUREAU_UNRESPONSIVE status
  • Added REGENERATED_VISIT webhook eventType
  • Added Webhook Signature section
  • Added Resistant AI irregularity detection outcomes to Paystub Verification
  • Added the new fraud_indication subnode to irregularity_detection
  • Added REVIEW as a new potential irregularity_detection status value
  • Added annual_salary_rate and estimated_gross_annual_income to payrolls
  • Deprecated annual_income on payrolls
  • Added gross_total_earnings_amount_current and gross_total_earnings_amount_ytd to payroll statements

June 2024

  • Added several values to irregularity_type table that were present in responses but missing from documentation
  • Added estimated_net_annual_income and estimated_hire_date fields for payroll reports.

May 2024

  • Updating the pay_frequency table to display values using underscores instead of hyphens. (Note: The actual values in the response did not change, the documentation was incorrectly displaying the hyphens)
  • Updating the payroll sample response from pay_frequency = weekly to WEEKLY.
  • Removed payroll specific substatuses including SOURCE_DATA_FETCH_NOT_SUPPORTED, SOURCE_DATA_FETCH_FAILED, SOURCE_AUTHENTICATION_FAILED.
  • Added the error substatus INCOMPLETE_INFORMATION

March 2024

  • Added payroll node under income and updated the employment node with employment_type, employment_status, job_title and hire_date

February 2024

  • Added a new Finicity sandbox profile that can trigger the SUCCESS webhook status with NO_RECENT_USABLE_INFORMATION substatus.

October 2023

  • Added substatus as a field in Visit level webhooks.
  • Added COAPPLICANT_GUARANTOR_PROVIDING as a possible substatus for NON_CONTRIBUTING_APPLICANT visits.
  • Added INVALID_EXTERNAL_ID and INVALID_PUBLIC_ID errors in Error Codes section.
  • Added externalId field to the webhook body.

September 2023

  • Added human-readable labels to the product inquiry_types table.

August 2023

  • Add field nova_report_revision to the meta section.

March 2023

February 2023

  • Add explanations to substatus table.

December 2022

  • Specify incomes node can be omitted from the report.
  • Specify inflows can be omitted from the report.
  • Add INVALID_DATE_FORMAT_SUBMITTED to substatus table.

September 2022

July 2022

  • Add current_balance, routing_number and full_account_number to account_details.

June 2022

  • Add annual_net_income to the insights section under income.

May 2022

  • Update usage of NovaConnect widget to Cash Atlas widget.

April 2022

  • Update text references of Insight to Cash Atlas in API documentation.
  • Update outdated Finicity API link.
  • Update API documentation link from https://docs.novacredit.com/voei to https://docs.novacredit.com/cash-atlas.
  • Add adverse action codes and descriptions to the adverse_action_codes node.
  • Update quickstart guide link from https://demo.novacredit.com/voei-quickstart-guide to https://docs.neednova.com/cash-atlas-quickstart.
  • Update usage of /connect/insight to /connect/cash-atlas.
  • Remove attributes from account_details subnode.

March 2022

November 2021

  • Update usage of /connect/voei to /connect/insight.
  • Added NON_CONTRIBUTING_APPLICANT as a new webhook status.

October 2021

August 2021

  • Deprecated support for work email verification.

June 2021

March 2021

  • Added heuristics_checks for employment verification.
  • Added more detail on visit & supplier logic combinations.

February 2021

  • Added sandbox information for work email and paystub verification in Sandbox Mode.

December 2020

November 2020

October 2020

  • Added eventType to the webhook body along with some new body keys and statuses associated with each webhook event type.
  • Added substatus to the history object within the webhook body.