Data contract
One row = one overdue loan. The same shape is used by the push API, the pull API, and (as columns) the CSV path. Unknown fields are ignored, never fatal.
Required
| Field | Type | Rules |
|---|---|---|
sourceLoanNumber | string ≤64 | Your stable loan ID — the key for every later lookup, update, webhook, and payment. Unique within your book. |
borrower.name | string | Full name. |
borrower.phone | string | Indian mobile; +91 / 91 / leading-0 accepted, normalised to 10 digits. |
borrower.address.pincode | string | 6-digit PIN. Drives partner matching — accuracy directly affects collection speed. |
loan.outstandingAmount | number | Total currently due (INR), > 0. |
Strongly recommended
| Field | Why it matters |
|---|---|
loan.dpd (number or "61-90" range) | Sets priority, partner incentive, and visit type. |
loan.emiAmount, loan.loanAmount, loan.disbursedAmount | Shown to the partner; better borrower conversations. |
loan.nextDueDate, loan.disbursedDate | Dates: YYYY-MM-DD, DD-MM-YYYY, 28-Apr-26 all accepted. |
loan.lateCharges, loan.interestRate, loan.tenure, loan.totalRepayable, loan.productName | Dispute handling at the door. |
borrower.address.line1/line2/city/state/landmark | Better geocoding → faster visits. |
borrower.email, borrower.language, borrower.employerName | Payment-link delivery & partner briefing. |
The batch envelope (push API)
{
"fullSnapshot": false,
"rows": [ { "sourceLoanNumber": "LN-…", "borrower": { … }, "loan": { … } } ]
}
fullSnapshot: trueasserts "this is my complete outstanding book" — any of your active cases absent from the batch get flagged for review (borrower may have paid you directly). Use it for daily/weekly reconciliation pushes; never for incremental ones.- Re-sending a row for an existing loan updates it (outstanding, contact, address). One active case per loan is enforced by us — duplicates are structurally impossible.
Validation failures come back per-row with the index, field, and reason — see errors.