Credit Decision Engine 2.0.0 OAS 3.0

https://bre.sotcrm.com/docs/spec

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
OutcomeMeaning
ApprovedLoan approved — proceed to disbursement
RejectDoes not meet eligibility criteria
PW AAProceed With Account Aggregator — bank statement fetch required
PW AA + EmploymentAA + PF / Employment verification required

Endpoints
POST /api/v1/evaluate/upload Evaluate — 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": "Approved", // 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)", "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 in 6m with overdue > ₹5,000 "pl_disbursed_6m_overdue_gt5k_closed": 0 // same but already closed (paid off) } } }
POST /api/v1/evaluate/raw Evaluate — 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/health Service health check
Returns service and database status. No authentication required.
▶ Try it out
GET /api/v1/history Paginated 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.
Path Parameters
id
string
required
Applicant ID — e.g. 9931828
▶ Try it out
id *