Back to neotek ↗Get Sandbox Access

Income Verification

Overview

Income Verification tells you how much a customer earns, using the bank accounts they have already linked. It returns their income broken down by source — salary, rental income, investment returns — with an average for each.

Use it to make lending, risk, underwriting and eligibility decisions from real bank data.


Prerequisites

  • Authentication: Obtain an access token using the Client Credentials flow (see Getting Started → Authentication). Use scope income_verification when generating the token.
  • Open Banking Prerequisites: Create an Accounts Link for the target institution and keep the resulting AccountsLinkId (see Getting Started → Open Banking Prerequisites). Income Verification requires AccountsLinkIds and a PSUId.
  • Subscription: Subscribe to Income Verification in your chosen environment.

IncomeVerificationPlus

POSThttps://test.api.neotek.sa/income-verification/v1/income-verification-plus

Sandbox URL · in Production call https://api.neotek.sa

Body — required as a whole:

ParameterRequiredDescription
psu_idRequiredthe Payment Service User id: the identifier you assign to the customer in your own system. Use the same id you sent when creating the accounts link, since that is how Neotek resolves which consented accounts to return
account_idsRequiredthe accounts to classify, as an array of AccountId values from ListProfileAccounts
from_dateRequiredstart of the range, YYYY-MM-DD
to_dateRequiredend of the range, YYYY-MM-DD
account_link_idOptionalnarrow the request to a single consent/link
cURL
curl -X POST 'https://test.api.neotek.sa/income-verification/v1/income-verification-plus' \  -H 'Authorization: Bearer <ACCESS_TOKEN>' \  -H 'Content-Type: application/json' \  -d '{    "psu_id": "PTP100",    "from_date": "2026-01-01",    "to_date": "2026-07-29",    "account_ids": ["ACC-999"]}'

Response (trimmed to one transaction per category)

JSON
[    {        "psu_id": "PTP100",        "account_id": "ACC-999",        "analysis_period": {            "from_date": "2026-01-01T00:00:00",            "to_date": "2026-07-29T00:00:00",            "months_covered": 7        },        "income_summary": {            "salary": {                "transactions": [                    {                        "amount": 17998.89,                        "date": "2026-06-27T04:00:00",                        "name": "POS",                        "description": "Salary"                    }                ],                "average_amount": 18940.640833333335            },            "rent_credited": {                "transactions": [                    {                        "amount": 8253.76,                        "date": "2026-07-05T04:00:00",                        "name": "REAL_ESTATE_RENTAL_INCOME",                        "description": "Ejar Rent Income"                    }                ],                "average_amount": 6732.808571428572            },            "investment": {                "transactions": [                    {                        "amount": 713.12,                        "date": "2026-06-14T04:00:00",                        "name": "INVESTMENT",                        "description": "murabaha profit"                    }                ],                "average_amount": 2540.639722222222            }        }    }]

Errors

CodeStatusCause and Action
400Bad RequestInvalid or missing request fields. Check the error Code and Path. Common: NTSP.ERROR.400.349 = PSUId is mandatory.
401UnauthorizedToken missing, expired, or invalid. Refresh the bearer token and retry.
403ForbiddenNo valid subscription or insufficient scope. Verify client credentials and that the correct scope is included for the service being called.
405Method Not AllowedWrong HTTP verb for this endpoint. Check the endpoint specification.
406Not AcceptableAccept header mismatch. Use application/json.
429Too Many RequestsRate limit exceeded. Wait the number of seconds in the Retry-After response header before retrying.
500Internal Server ErrorUnexpected server error. Retry with exponential backoff. Include x-request-id when raising a support ticket.

Ready to build with Income Verification?

Create a sandbox app, grab your credentials, and make your first call in minutes.