Rule-based loan eligibility API that parses a CIBIL bureau report and returns a credit decision based on CIBIL score, monthly salary, and account history.
Decision Outcomes
Outcome
Meaning
Approved
Loan approved — proceed to disbursement
Reject
Does not meet eligibility criteria
PW AA
Proceed With Account Aggregator — bank statement fetch required
PW AA + Employment
AA + PF / Employment verification required
Endpoints
POST/api/v1/evaluate/uploadEvaluate — upload bureau file⌄
Upload the raw bureau file you received from CIBIL/Experian/Equifax along with the applicant's monthly income. CIBIL score is extracted automatically from the file — no JSON wrapper needed.
Score is read from CIR-REPORT-FILE → REPORT-DATA → STANDARD-DATA → SCORE[0].VALUE.
Form Parameters
monthly_income
number
required
Applicant monthly income in INR — e.g. 46167
cir_file
file (.json/.txt)
required
Raw bureau file from CIBIL. CIBIL score extracted automatically from SCORE[0].VALUE
source
string
optional
Audit tag stored in decision log (default: file_upload)
▶ Try it outmultipart/form-data
monthly_income *
cir_file * — Raw bureau file (CIBIL score extracted automatically)
source
Response — 200 OK
{"success": true,
"data": {"applicant_id": "9931828",
"applicant_name": "LENINKUMAR KRISHNAMURTHI",
"pan": "GSDPK1539R",
"credit_score": 653, // auto-extracted from bureau file"monthly_income": 60000,
"decision": "PW AA + Employment", // Approved | Reject | PW AA | PW AA + Employment"rule_set": "Score>=539_Salary>50K",
"bracket": "Credit Score ≥539 & Monthly Salary >₹50,000",
"rule_number": 17,
"reason": "Personal Loan closed within last 3 months with no overdue (>50 accounts)",
"pl_count_rule": "PL count = 5 < 10: decision downgraded from Approved to PW AA + Employment",
"record_id": 42,
"computed_params": {// ── Account Summary (PRIMARY-ACCOUNTS-SUMMARY) ───────"total_accounts": 306,
"active_accounts": 16,
"overdue_accounts": 1,
"secured_accounts": 1,
"unsecured_accounts": 305,
"untagged_accounts": 0,
"total_current_balance": 4946121,
"current_balance_secured": 4651251,
"current_balance_unsecured": 294870,
"total_sanctioned_amt": 5395638,
"total_disbursed_amt": 5395638,
"total_amt_overdue": 16601,
// ── Personal Loan Analysis ───────────────────────────"personal_loan_count": 299,
"pl_active_last_3_months": 11,
"pl_closed_last_3_months": 20,
"pl_closed_last_6_months": 45,
"pl_overdue_last_3_months": 2,
"pl_overdue_last_6_months": 2,
"pl_overdue_last_10_months": 2,
"pl_closed_after_overdue": 1,
"pl_active_no_overdue_3_months": 12,
"pl_inactive_last_3_months": 266,
"pl_disbursed_6m_overdue_gt5k": 1,
"pl_disbursed_6m_overdue_gt5k_closed": 0},
"amount_approval": {// ── Loan Amount Calculation (16-rule matrix) ─────────"rule_id": 16, // matched rule row (1-16)"approval_amount_max": 75000, // hard cap from rule table"foir_salary_pct": 40, // 40% applied on monthly income"foir_bureau_pct": 15, // 15% applied on max bureau disbursed (0 if unused)"salary_foir_amount": 24000, // 60000 × 40% = 24,000"bureau_foir_amount": 18750, // 125000 × 15% = 18,750"max_bureau_disbursed": 125000,// highest PL disbursed amt in bureau"final_amount": 18750, // min(24000, 18750, 75000) = 18,750"description": "Score>=539 | PW AA + Employment | Income>=50K | PL>0 → 40% salary or 15% bureau FOIR, cap ₹75,000"}}}
POST/api/v1/evaluate/rawEvaluate — raw JSON body⌄
Send monthly_income and cir_report as top-level JSON keys. Do NOT include credit_score in the body — it is parsed automatically from inside cir_report: CIR-REPORT-FILE → REPORT-DATA → STANDARD-DATA → SCORE[0].VALUE
💡 Paste the bureau JSON directly in the cir_report field below. No outer wrapper required.
Body Parameters
monthly_income
number
required
Monthly income in INR
cir_report
object
required
Bureau JSON. Score extracted from SCORE[0].VALUE — no credit_score field needed
X-Source
header
optional
Audit source tag
▶ Try it outapplication/json
Body
Headers
monthly_income *
cir_report * — paste the bureau JSON here (no wrapper)
X-Source
GET/api/v1/healthService health check⌄
Returns service and database status. No authentication required.
▶ Try it out
GET/api/v1/historyPaginated decision history⌄
Returns BRE decisions ordered by newest first. Filter by outcome.
Query Parameters
outcome
string
optional
Approved | Reject | PW AA | PW AA + Employment
page
integer
optional
Page number (default 1)
page_size
integer
optional
Records per page (default 20)
▶ Try it out
outcome
page
page_size
GET/api/v1/history/pan/{pan}History by PAN⌄
Returns all BRE decisions for a given PAN number, newest first.
Path Parameters
pan
string
required
PAN number — e.g. GSDPK1539R
▶ Try it out
pan *
GET/api/v1/history/applicant/{id}History by applicant ID⌄
Returns all BRE decisions for a given applicant ID.