Credit Assessment
Score the parent’s ability to repay, via Mono Connect or an uploaded bank statement, then poll until it completes.
All responses wrap in the same envelope as the rest of this API, data below is
that envelope’s data field.
Exchange Mono Connect code
POST /api/loans/mono/exchangeAfter the Mono Connect widget returns a code on the frontend, exchange it for
monoAccountId used in Credit assessment (Mono).
Headers
| Header | Value |
|---|---|
Accept | application/json |
Authorization | Bearer {parentAccessToken} |
Content-Type | application/json |
Request body
| Field | Description |
|---|---|
code | Code returned by the Mono Connect widget. |
{
"code": "mono_connect_code_from_widget"
}Try it
Credit assessment (Mono)
POST /api/loans/credit-assessment/monoStart credit scoring using a linked Mono account. Returns immediately with status
Processing: poll Get credit assessment until
complete.
Required: incomeSource (SalaryEarner | BusinessOwner), tenureMonths.
Optional employmentInfo adds employer/income context for institution applicants.
Headers
| Header | Value |
|---|---|
Accept | application/json |
Authorization | Bearer {parentAccessToken} |
Content-Type | application/json |
Request body
| Field | Description |
|---|---|
bankAccountNumber / bankCode / bankName | The bank account linked via Mono. |
monoAccountId | From Exchange Mono Connect code. |
incomeSource | Required, SalaryEarner or BusinessOwner. |
tenureMonths | Required. |
employmentInfo | Optional, employer / income context. |
{
"bankAccountNumber": "0123456789",
"bankCode": "058",
"bankName": "GTBank",
"monoAccountId": "mono_account_id_here",
"incomeSource": "SalaryEarner",
"tenureMonths": 6,
"employmentInfo": {
"employerName": "Example Ltd",
"jobTitle": "Analyst",
"monthlyIncome": 350000,
"employmentStartDate": "2022-01-15",
"verificationContactName": "HR",
"verificationContactPhone": "08011112222"
}
}Response 200
Same shape as upload statement, source
will be Mono rather than StatementUpload.
Try it
Credit assessment (upload statement)
POST /api/loans/credit-assessment/uploadStarts credit scoring from an uploaded bank statement, PDF, JPEG, or PNG, max
5MB. Multipart form: the fields below plus a file. Returns immediately with
status Processing: poll Get credit assessment
until it completes.
Use documentPassword if the PDF is password-protected.
Headers
| Header | Value |
|---|---|
Accept | application/json |
Authorization | Bearer {parentAccessToken} |
No Content-Type header, the browser sets its own multipart boundary for you.
Form fields
| Field | Description |
|---|---|
bankAccountNumber / bankCode / bankName | The bank account the statement is for. |
incomeSource | Required, SalaryEarner or BusinessOwner. |
tenureMonths | Required. |
employmentInfo.employerName | Optional. |
documentPassword | Optional, only if the PDF is password-protected. |
file | Required, PDF, JPEG, or PNG, max 5MB. |
Response 200
{
"success": true,
"message": "Request successful",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ticketNumber": "CA-20250901-0042",
"status": "Processing",
"creditScore": 0,
"rating": "Ineligible",
"eligibleLoanAmount": 0,
"justification": "",
"isEligible": false,
"failureReason": null,
"source": "StatementUpload",
"isManuallyCreated": false,
"createdByAdminId": null
},
"errors": [],
"statusCode": 200
}| Field | Description |
|---|---|
id | Pass this as creditAssessmentId when you submit a loan or poll below. |
ticketNumber | Human-readable reference for this assessment. |
status | Processing right after upload, poll until Completed or Failed. |
creditScore / rating / eligibleLoanAmount / justification / isEligible | Populated once status is Completed, see Get credit assessment. |
source | StatementUpload for this endpoint. |
Try it
Get credit assessment (poll)
GET /api/loans/credit-assessment/{assessmentId}Poll after initiating an assessment (Mono or upload). Same shape as the upload
response, only status and the scoring fields change as it progresses. When
status is Completed, use id as creditAssessmentId in loan submission.
Failed includes failureReason.
Headers
| Header | Value |
|---|---|
Accept | application/json |
Authorization | Bearer {parentAccessToken} |
Response 200, Processing
{
"success": true,
"message": "Request successful",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ticketNumber": "CA-20250901-0042",
"status": "Processing",
"creditScore": 0,
"rating": "Ineligible",
"eligibleLoanAmount": 0,
"justification": "",
"isEligible": false,
"failureReason": null,
"source": "StatementUpload",
"isManuallyCreated": false,
"createdByAdminId": null
},
"errors": [],
"statusCode": 200
}Response 200, Completed
{
"success": true,
"message": "Request successful",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ticketNumber": "CA-20250901-0042",
"status": "Completed",
"creditScore": 720,
"rating": "Good",
"eligibleLoanAmount": 450000.00,
"justification": "Stable salary inflows over 6 months; low debt-to-income ratio.",
"isEligible": true,
"failureReason": null,
"source": "StatementUpload",
"isManuallyCreated": false,
"createdByAdminId": null
},
"errors": [],
"statusCode": 200
}Use id as creditAssessmentId in Submit loan application once status is Completed.
Response 200, Failed
{
"success": true,
"message": "Request successful",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ticketNumber": "CA-20250901-0042",
"status": "Failed",
"creditScore": 0,
"rating": "Ineligible",
"eligibleLoanAmount": 0,
"justification": "",
"isEligible": false,
"failureReason": "Unable to parse bank statement. Please upload a clearer PDF.",
"source": "StatementUpload",
"isManuallyCreated": false,
"createdByAdminId": null
},
"errors": [],
"statusCode": 200
}