Developers
Integrate in an afternoon, not a quarter
A REST API with predictable conventions, signed webhooks for everything that happens to a borrower, and plain file exchange for lenders whose LMS prefers it. This page is the map; the full reference and an OpenAPI document are issued with your sandbox tenant.
$ curl https://api.attpro.in/api/v1/borrowers?dpd_min=31&limit=2 \
-H "Authorization: Bearer attpro_live_XXXXXXXX"
{ "data": [
{ "id": "brw_01J8…", "loan_ref": "LN-2214",
"dpd": 34, "outstanding_paise": 485000,
"last_touch": "call.completed", "ptp": "2026-08-12" },
{ "id": "brw_01J9…", "loan_ref": "LN-1187",
"dpd": 52, "outstanding_paise": 1210000,
"last_touch": "touch.read", "ptp": null } ],
"meta": { "cursor_next": "eyJpZCI6…" } }On this page
Overview
Three ways in
Pick the one your stack already speaks. Most lenders start with files and add the API when they want same-day state.
REST API
JSON over HTTPS at /api/v1, per tenant, cursor-paginated, idempotent writes.
Webhooks
Signed POSTs to your endpoint for every borrower event, retried with backoff for 24 hours.
SFTP file exchange
A nightly CSV in, extracts out, with saved column mappings and a preflight dry run.
Authentication
API keys, scoped to a tenant
Keys are issued per tenant by an administrator in the platform, carry a role, and can be revoked at any time. Every request is logged against the key that made it.
curl https://api.attpro.in/api/v1/borrowers?limit=50 \
-H "Authorization: Bearer attpro_live_XXXXXXXX" \
-H "Accept: application/json"Keys are shown once at creation and stored envelope-encrypted. Rotate by issuing a new key and revoking the old; both stay valid during the overlap you choose.
Conventions
The same shape everywhere
Four rules that hold on every endpoint, so the second integration is a copy of the first.
Responses
Every list returns data and meta.cursor_next. Pass the cursor back to page; never offset.
{ "data": [ ... ],
"meta": { "cursor_next": "eyJpZCI6..." } }Errors
RFC 7807 problem details with a stable type you can switch on.
{ "type": "https://attpro.in/errors/validation",
"title": "Invalid field",
"status": 422,
"detail": "phone must be E.164",
"instance": "/api/v1/borrowers" }Idempotency
Send Idempotency-Key on any write you might retry. The same key returns the original result for 24 hours.
Money and time
Amounts are integers in paise. Timestamps are ISO 8601 in UTC; calling windows and reports are in IST.
Resources
What you can read and write
Eight resources cover the book. Each is the same record the operator sees in the app; there is no separate API model.
/borrowersAccounts under collection: identity, outstanding, DPD, custom fields, consent and DNC state, sibling loans./campaignsA book, a strategy and a window. Enrol borrowers, activate a working file, read progress./flowsPublished strategies and their runs per borrower, with every node visited and the branch taken./touchesEvery contact on every channel: status, delivery and read signals, disposition./callsVoice calls with recording, transcript, sentiment and QA annotations./paymentsPayment links, receipts, promises to pay and their kept / broken state./field-visitsAllocated and completed visits with geo-tag, time and outcome./dispositionsThe tenant's disposition taxonomy, editable, with the next-action each code implies.Webhooks
Every borrower event, signed
Register an HTTPS endpoint per tenant. Each delivery carries an HMAC-SHA256 signature over the raw body; verify it before you trust the payload. Failed deliveries retry with backoff for 24 hours.
touch.delivered / touch.read / touch.repliedMessaging signals as the carrier reports them.call.completedAn AI or human call ended, with disposition, duration and recording reference.ptp.recorded / ptp.kept / ptp.brokenPromise lifecycle.payment.receivedA payment reconciled to an account via the gateway callback.field_visit.completedA doorstep visit captured on the officer's app.borrower.dnc_changed / borrower.consent_changedConsent and do-not-call state changes.flow_run.endedA borrower's run reached an end node, with the end branch.POST https://lender.example/hooks/attpro
X-Attpro-Signature: sha256=3f1c...
X-Attpro-Event: payment.received
{ "id": "evt_01J...", "occurred_at": "2026-08-12T05:01:10Z",
"tenant": "t_acme", "type": "payment.received",
"data": { "borrower_id": "...", "amount_paise": 485000, "method": "upi" } }File exchange
A nightly CSV is enough to start
Drop the LMS extract on the SFTP endpoint we provision. The upload wizard's saved mapping applies, the file dry-runs, and only a clean file commits. Extracts of dispositions, promises and payments are produced on the schedule you set.
- UTF-8 CSV, one row per account, any column order; mapping saved per lender.
- Preflight reports duplicates, bad phones and missing mandatory fields before anything touches the book.
- One active working file per campaign; a new file retires the old one and re-enrols in the background.
Sandbox and limits
A tenant to break things in
Sandbox tenants ship with a demo book, test numbers for voice, and provider stubs so nothing real is dialled or charged. Rate limits are generous for normal integration traffic and stated in the reference; ask if you plan to bulk-load.
- webhook retries with backoff
- 24 h
- idempotency-key replay window
- 24 h
- default page size, cursor-paginated
- 50
- real calls or charges from a sandbox
- 0
Bring your LMS export.
A file-mapping session with an engineer is the first hour of onboarding. Bring one, and the demo runs on your own columns.