PagarBook attendance, CTC and staff-loan records
PagarBook:Attendance & Payroll is the Android client from Staff Payroll & Attendance Khata App (pagarbook.com) for Indian MSME owners who keep a digital staff khata. After a phone OTP or Truecaller login, owners add workers, mark daily attendance, apply leave, set CTC salary structures, pay wages including online collections, and track staff loans from the same shop-floor ledger. Play rates it 4.37 from about 92,000 reviews with 10 million-plus downloads. It sits next to greytHR, Darwinbox and ADP Mobile Solutions as the MSME khata rather than a tenanted enterprise HRIS.
Staff-day punches land as workedMinutes and punchTime on each attendance row, with the same payload rolling present, absent, halfDay, fineMinutes and overTimeMinutes into a day summary and flagging hasOddPunches or previousDatesApprovalPending when a mark still needs a manager. Leave ledgers sit beside those days: totalAccruedLeaves against totalAvailedLeaves and totalEncashableLeaves, then applications carrying startDate, endDate, leaveCategoryId and fromSession.
The staff roster returns totalStaff, onboardingPendingStaffCount and per-worker companyStaffId. Active CTC cards expose ctc, hasBreakup, templateId and statutoryTemplateId; salary-detail screens split earnings, deductions and payments with paymentDate and onlineId. Staff-loan ledgers pair records with loan and repayment totals.
Payroll ops, labour-compliance desks and lending stacks use those punches, CTC cards and loan rows to reconcile wages, leave liability and advances. openData Studio turns the same objects into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Verify phone OTP and load session
POST
/v1/khata/session/phone-otposintExchanges phone plus otp for the signed-in KmpUser, including token, businessId and businessName that scope later staff, attendance and payroll calls.
Auth: Unauthenticated. Body is phone plus otp from the SMS code. Returns KmpUser.token used as Authorization: Bearer on later calls.
- id
- name
- token
- fcmToken
- phone
- businessId
- businessName
- language
- userPin
- currentAppFlavour
- adminCount
- businessStartDate
- employeeStartDate
POST /v1/khata/session/phone-otp HTTP/1.1 Content-Type: application/json { "phone": "9876543210", "otp": "482916" }{ "id": 44102, "name": "Ramesh Patel", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9", "fcmToken": "fcm-8f21c4a0", "phone": "9876543210", "businessId": 9104, "businessName": "Patel Textiles", "language": 1, "email": "[email protected]", "userPin": null, "currentAppFlavour": "pagarbook", "adminCount": 2, "businessStartDate": "2019-06-01", "employeeStartDate": "2019-06-01" }List all staff
GET
/v1/khata/crew/rosteropendataPages the business staff roster with totalStaff, onboardingPendingStaffCount and per-worker companyStaffId.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- sections
- summary
- cursor
- balance
- firstStartDate
- self
- workBasisStaffExists
- onboardingPendingStaffCount
- totalStaff
- id
- name
- companyStaffId
GET /v1/khata/crew/roster HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Accept: application/json{ "sections": [{ "title": "Active", "employees": [{ "id": 55201, "name": "Anita Rao", "companyStaffId": "EMP-1024" }] }], "summary": { "balance": 18450.0, "firstStartDate": "2019-06-01", "self": {"id": 44102, "name": "Ramesh Patel", "companyStaffId": "OWNER"}, "workBasisStaffExists": true, "onboardingPendingStaffCount": 3, "totalStaff": 42 }, "cursor": "c-19f2" }Staff attendance by worker
GET
/v1/khata/attendance/worker/{staffId}opendataReturns one worker's attendance rows plus a summary of present, absent, workedMinutes, fineMinutes and overTimeMinutes.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- summary
- items
- sections
- previousDatesApprovalPending
- staffId
- companyStaffId
- attendanceDate
- workedMinutes
- effectiveWorkedMinutes
- present
- absent
- halfDay
- fineMinutes
- overTimeMinutes
- hasOddPunches
- hasUntaggedPunches
GET /v1/khata/attendance/worker/55201 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Accept: application/json{ "summary": { "present": 18.0, "absent": 2, "halfDay": 1, "neutral": 0, "workedMinutes": 8640, "fineMinutes": 45, "overTimeMinutes": 120, "leaveCount": 1.0, "paidHoliday": 0.0, "paidWeeklyHoliday": 4.0, "onDuty": 0, "totalPendingApprovals": 1 }, "items": [{ "staffId": 55201, "companyStaffId": "EMP-1024", "attendanceDate": "2026-10-03", "workedMinutes": 480, "effectiveWorkedMinutes": 465, "leaveType": null, "leaveName": null, "leaveCategoryId": null, "isCompOffLeave": false, "hasUntaggedPunches": false, "hasOddPunches": false }], "sections": [], "previousDatesApprovalPending": false }Attendance by calendar date
GET
/v1/khata/attendance/day/{date}opendataLoads the whole-crew attendance board for one calendar date, including pending-approval flags.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- summary
- items
- previousDatesApprovalPending
- present
- absent
- workedMinutes
- fineMinutes
- fineStaffCount
- overTimeMinutes
- overTimeStaffCount
- msaStaffCount
- totalPendingApprovals
- staffId
- attendanceDate
GET /v1/khata/attendance/day/2026-10-03 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Accept: application/json{ "summary": { "present": 38.0, "absent": 3, "halfDay": 1, "neutral": 0, "workedMinutes": 18240, "fineMinutes": 90, "fineStaffCount": 4, "overTimeMinutes": 240, "overTimeStaffCount": 6, "onDuty": 1, "msaStaffCount": 2, "totalPendingApprovals": 2 }, "items": [{ "staffId": 55201, "companyStaffId": "EMP-1024", "attendanceDate": "2026-10-03", "workedMinutes": 480, "hasOddPunches": false, "hasUntaggedPunches": false }], "sections": [], "previousDatesApprovalPending": true }Create attendance punch
POST
/v1/khata/attendance/punchopendataWrites a punch against an attendanceId at punchTime for the AMS day record.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- attendanceId
- punchTime
POST /v1/khata/attendance/punch HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Content-Type: application/json { "attendanceId": 880341, "punchTime": "2026-10-03T09:12:00+05:30" }{}Leave balances for a staff member
GET
/v1/khata/leave/balance/{staffId}opendataReturns accrued, availed, balanced and encashable leave totals for one staffId, optionally as of date.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- summary
- leaveCategories
- staff
- availedWeeklyOffs
- leaveTemplate
- totalAccruedLeaves
- totalAvailedLeaves
- totalBalancedLeaves
- totalEncashableLeaves
- leaveBalance
- encashableLeaves
- accruedLeaves
- availedLeaves
- toBeAccrued
- templateLeaveCount
- isCompOffLeave
GET /v1/khata/leave/balance/55201?date=2026-10-03 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Accept: application/json{ "summary": { "totalAccruedLeaves": 18.0, "totalAvailedLeaves": 6.5, "totalBalancedLeaves": 11.5, "totalEncashableLeaves": 4.0 }, "leaveCategories": [{ "id": 3, "name": "Casual Leave", "leaveBalance": 11.5, "encashableLeaves": 4.0, "templateLeaveCount": 18.0, "accruedLeaves": 18.0, "availedLeaves": 6.5, "toBeAccrued": 1.5, "isCompOffLeave": false }], "staff": {"id": 55201, "name": "Anita Rao"}, "availedWeeklyOffs": 4, "leaveTemplate": {"id": 12, "name": "Shop floor"} }Submit leave application
POST
/v1/khata/leave/requestopendataCreates a leave application for staffId across startDate/endDate and returns the approval-flow envelope.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- staffId
- startDate
- endDate
- leaveCategoryId
- fromSession
- toSession
- description
- customFields
- isCompOffLeave
- oldLeaveApplicationId
- staff
- approver
- approvers
- leaveApplication
- applicationApprovalFlow
POST /v1/khata/leave/request HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Content-Type: application/json { "staffId": 55201, "startDate": "2026-10-14", "endDate": "2026-10-16", "leaveCategoryId": 3, "fromSession": "FULL_DAY", "toSession": "FULL_DAY", "description": "Family function", "oldLeaveApplicationId": null, "customFields": [], "isCompOffLeave": false }{ "staff": {"id": 55201, "name": "Anita Rao"}, "approver": {"id": 44102, "name": "Ramesh Patel"}, "approvers": [{"id": 44102, "name": "Ramesh Patel"}], "leaveApplication": { "id": 77321, "startDate": "2026-10-14", "endDate": "2026-10-16", "description": "Family function", "fromSession": "FULL_DAY", "toSession": "FULL_DAY", "isCompOffLeave": false, "leaveAppliedDate": "2026-10-04", "attachments": [] }, "applicationApprovalFlow": {"status": "PENDING"} }Active salary structure for a staff member
GET
/v1/khata/ctc/active/{staffId}openfinanceReads the active CTC card for a staff member: ctc, period, breakup flag, template ids and statutory config.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- id
- staffId
- ctc
- startDate
- period
- hasBreakup
- fbpPlanId
- templateId
- statutoryTemplateId
- active
- components
- scheduledRevision
- statutoryConfig
GET /v1/khata/ctc/active/55201 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Accept: application/json{ "id": 22011, "staffId": 55201, "ctc": 360000.0, "startDate": "2026-04-01", "period": "MONTHLY", "hasBreakup": true, "fbpPlanId": 0, "templateId": 44, "statutoryTemplateId": 7, "active": true, "components": [{ "name": "Basic", "amount": 15000.0 }], "scheduledRevision": null, "statutoryConfig": {"pfEnabled": true, "esiEnabled": true} }Salary details (earnings, deductions, payments)
GET
/v1/khata/wage-detailopenfinanceReturns the salary-detail envelope: earnings and deductions plus PaymentLog rows with paymentDate and onlineId.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- payments
- adjustments
- earnings
- deductions
- id
- amount
- paymentType
- category
- paymentDate
- description
- onlineId
- employerId
- employeeId
- reportId
- canUpdate
- component
- entryDate
GET /v1/khata/wage-detail?staffId=55201 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Accept: application/json{ "payments": [{ "id": 90112, "amount": 14250.0, "paymentType": 1, "category": "SALARY", "paymentDate": "2026-09-30", "description": "September salary", "onlineId": "pay_Mz8k21", "employerId": 9104, "employeeId": 55201, "reportId": 33001, "canUpdate": false }], "adjustments": {}, "earnings": [{ "id": 1, "component": "Basic", "amount": 15000.0, "description": null, "reportId": 33001, "entryDate": "2026-09-01", "canUpdate": false }], "deductions": [{ "id": 2, "component": "PF", "amount": 1800.0, "reportId": 33001, "entryDate": "2026-09-01", "canUpdate": false }] }Staff loan ledger
GET
/v1/khata/staff-advancesopenfinanceLists staff-loan and repayment records with running totals.loan and totals.repayment.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- records
- totals
- id
- amount
- type
- description
- transactionDate
- employeeId
- employerId
- reportId
- createdAt
- updatedAt
- loan
- repayment
GET /v1/khata/staff-advances?employeeId=55201 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Accept: application/json{ "records": [{ "id": 6104, "amount": 5000.0, "type": "LOAN", "description": "Festival advance", "transactionDate": "2026-09-12", "employeeId": 55201, "employerId": 9104, "reportId": 33001, "createdAt": "2026-09-12T11:04:00+05:30", "updatedAt": "2026-09-12T11:04:00+05:30" }], "totals": { "loan": 5000.0, "repayment": 1500.0 } }Overall salary report
GET
/v1/khata/wage-boardopenfinanceReturns the overall salary report: per-employee salaryTillDate, paymentsTotal and projectedSalary plus crew totals.
Auth: Bearer token from the phone-OTP session (KmpUser.token).
- employees
- total
- id
- name
- startDate
- endDate
- balance
- salaryType
- paymentsTotal
- salaryTillDate
- projectedSalary
GET /v1/khata/wage-board HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Accept: application/json{ "employees": [{ "id": 55201, "name": "Anita Rao", "startDate": "2026-04-01", "endDate": "2026-09-30", "balance": 18450.0, "salaryType": "monthlyRegular", "paymentsTotal": 85500.0, "salaryTillDate": 71250.0, "projectedSalary": 85500.0 }], "total": { "balance": 512000.0, "paymentsTotal": 498000.0, "salaryTillDate": 415000.0, "projectedSalary": 498000.0 } }
Data categories
- staff roster
- attendance punches
- leave balances
- salary structures
- payroll payments
- staff loans
Where teams use this data
MSME wage-run reconciliation
Payroll ops pull CTC cards, earnings/deductions and PaymentLog rows (paymentDate, onlineId) to match what left the business account against what each companyStaffId was owed.
Attendance and overtime audit
Compliance desks join workedMinutes, fineMinutes, overTimeMinutes and hasOddPunches with the date-board previousDatesApprovalPending flag to catch unapproved marks before wages lock.
Leave-liability and encashment
HR ledgers read totalAccruedLeaves, totalAvailedLeaves and totalEncashableLeaves, then the leave-application startDate/endDate trail, to provision unused leave and process encashment.
Staff-advance recovery
Lending or bookkeeping stacks subtract totals.repayment from totals.loan and attach LoanRecord transactionDate lines to the next salary reportId so advances are recovered on payday.
Frequently asked questions
What is PagarBook:Attendance & Payroll?
It is the Android staff-khata client from Staff Payroll & Attendance Khata App for Indian MSME owners: attendance, leave, CTC salary structures, wage payments and staff loans in one ledger.
Who uses PagarBook?
Shop-floor and small-business owners in India who keep worker attendance and wages themselves, rather than employees on a tenanted greytHR or Darwinbox HRIS.
How do owners sign in?
With a phone OTP, or through Truecaller verify. The session token then authorises staff, attendance and payroll calls for that business.
What worker records does it hold?
A staff roster with companyStaffId, daily punches and workedMinutes, leave balances including encashable days, active CTC cards, salary earnings/deductions/payments, and a staff-loan ledger.
Apps similar to PagarBook:Attendance & Payroll
- greytHR — Bengaluru-built employee self-service HRIS Indian enterprises issue to staff for punches, leave and payslips.
- Darwinbox — Cloud HCM suite used by larger Indian employers for the full hire-to-retire employee app.
- ADP Mobile Solutions — Global payroll-vendor employee app for punches, pay and tax forms at ADP-run companies.
- Paylocity — US mid-market cloud payroll and HCM mobile app for employees and payroll admins.
Topics
- PagarBook
- staff attendance
- MSME payroll
- staff khata
- CTC salary structure
- leave balance
- staff loan
- India payroll app
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use