Skip to Content
Parent Loans APICredit Assessment

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/exchange

After the Mono Connect widget returns a code on the frontend, exchange it for monoAccountId used in Credit assessment (Mono).

Headers

HeaderValue
Acceptapplication/json
AuthorizationBearer {parentAccessToken}
Content-Typeapplication/json

Request body

FieldDescription
codeCode returned by the Mono Connect widget.
{ "code": "mono_connect_code_from_widget" }

Try it

POST/api/loans/mono/exchange

Credit assessment (Mono)

POST /api/loans/credit-assessment/mono

Start 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

HeaderValue
Acceptapplication/json
AuthorizationBearer {parentAccessToken}
Content-Typeapplication/json

Request body

FieldDescription
bankAccountNumber / bankCode / bankNameThe bank account linked via Mono.
monoAccountIdFrom Exchange Mono Connect code.
incomeSourceRequired, SalaryEarner or BusinessOwner.
tenureMonthsRequired.
employmentInfoOptional, 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

POST/api/loans/credit-assessment/mono

Credit assessment (upload statement)

POST /api/loans/credit-assessment/upload

Starts 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

HeaderValue
Acceptapplication/json
AuthorizationBearer {parentAccessToken}

No Content-Type header, the browser sets its own multipart boundary for you.

Form fields

FieldDescription
bankAccountNumber / bankCode / bankNameThe bank account the statement is for.
incomeSourceRequired, SalaryEarner or BusinessOwner.
tenureMonthsRequired.
employmentInfo.employerNameOptional.
documentPasswordOptional, only if the PDF is password-protected.
fileRequired, 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 }
FieldDescription
idPass this as creditAssessmentId when you submit a loan or poll below.
ticketNumberHuman-readable reference for this assessment.
statusProcessing right after upload, poll until Completed or Failed.
creditScore / rating / eligibleLoanAmount / justification / isEligiblePopulated once status is Completed, see Get credit assessment.
sourceStatementUpload for this endpoint.

Try it

POST/api/loans/credit-assessment/upload

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

HeaderValue
Acceptapplication/json
AuthorizationBearer {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 }

Try it

GET/api/loans/credit-assessment/00000000-0000-0000-0000-000000000002