Developers

Finvosmart API

Connect your own systems to Finvosmart: create GST invoices, keep customers and items in sync, read your books and receive webhook notifications. Everything uses JSON over HTTPS with token-based sign-in.

Quick start

1. Sign in. Use a dedicated user for your integration, with the least-privileged role that covers what it needs. You get an access token.

curl -X POST https://app.finvosmart.com/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"integration@yourcompany.com","password":"…","companyCode":"ACME482"}'
{
  "success": true,
  "data": { "accessToken": "eyJhbGciOi…", "refreshToken": "eyJhbGciOi…", "companyCode": "ACME482", … }
}

2. Call the API with the token in the Authorization header. When it expires, sign in again or use POST /auth/refresh with the refresh token.

curl "https://app.finvosmart.com/api/v1/invoices?page=0&size=20" \
  -H "Authorization: Bearer <accessToken>"

Conventions

  • Base URL: https://app.finvosmart.com/api/v1
  • Every response is wrapped as { success, message, data, error }; your result is in data.
  • Lists that can grow are paged: pass page (from 0) and size; read content, totalElements and totalPages.
  • Dates are YYYY-MM-DD. Amounts are decimal numbers in rupees.
  • Errors use standard status codes: 400 (invalid request — see message), 401 (sign in again), 403 (the user's role lacks the permission listed below), 404 (not found), 429 (too many requests).
  • Rate limits: 30 requests per second per IP for the API; 5 sign-in attempts per minute per IP.
{
  "success": true,
  "data": {
    "content": [ … ],
    "currentPage": 0, "pageSize": 20, "totalElements": 134, "totalPages": 7
  }
}

Webhooks

An administrator registers an HTTPS address under Settings → Webhooks (or with POST /webhooks), choosing one event or * for all of them. The signing secret is shown once, when the endpoint is registered or its secret is replaced — store it then. When something happens, Finvosmart sends a JSON POST:

POST https://your-server.example/finvosmart
Content-Type: application/json
User-Agent: Finvosmart-Webhooks/1.0
X-FINVO-Event: payment.received
X-FINVO-Delivery: 5f0c6a4e-…            (new for every attempt)
X-FINVO-Timestamp: 1792473600           (Unix seconds)
X-FINVO-Signature: sha256=9c1f…         (HMAC-SHA256 of "<timestamp>.<body>")

{
  "id": "3b1e2f7a-…",                   (the same on every attempt: use it to ignore repeats)
  "event": "payment.received",
  "createdAt": "2026-10-20T04:30:00Z",
  "company": "<your company id>",
  "data": {
    "paymentId": "…", "invoiceId": "…", "invoiceNumber": "INV/26-27/000042",
    "customerId": "…", "customerName": "Acme Traders", "amount": 59000.00, "tdsAmount": 0,
    "paymentDate": "2026-10-20", "mode": "UPI", "reference": "4183…", "balanceDue": 0
  }
}

Verify every delivery. The signature is sha256= followed by the HMAC-SHA256, in lowercase hex, of the timestamp header, a full stop and the raw body, keyed with your secret. Refuse deliveries whose timestamp is more than five minutes away from your clock, and compare in constant time:

const crypto = require('crypto')

// rawBody: the request body exactly as received (before JSON parsing).
// headers: X-FINVO-Timestamp and X-FINVO-Signature from the request.
function isValid(rawBody, timestamp, signature, secret) {
  const age = Math.abs(Date.now() / 1000 - Number(timestamp))
  if (!Number.isFinite(age) || age > 300) return false          // older than 5 minutes: a replay
  const expected = 'sha256=' + crypto.createHmac('sha256', secret)
    .update(timestamp + '.' + rawBody, 'utf8').digest('hex')
  const a = Buffer.from(expected), b = Buffer.from(signature || '')
  return a.length === b.length && crypto.timingSafeEqual(a, b)
}
import hmac, hashlib, time

def is_valid(raw_body: bytes, timestamp: str, signature: str, secret: str) -> bool:
    try:
        if abs(time.time() - int(timestamp)) > 300:   # older than 5 minutes: a replay
            return False
    except (TypeError, ValueError):
        return False
    signed = timestamp.encode() + b"." + raw_body
    expected = "sha256=" + hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature or "")

Events

invoice.issuedAn invoice was issued (it left draft)
invoice.paidAn invoice was paid in full
invoice.overdueAn invoice passed its due date unpaid
invoice.cancelledAn invoice was cancelled
quotation.acceptedA customer accepted a quotation from its link
payment.receivedA customer payment was recorded
customer.createdA customer was added
bill.recordedA supplier bill or expense was recorded
bill.paidA supplier bill was paid in full
purchase_order.approvedA purchase order was approved
leave.approvedA leave request was approved
leave.rejectedA leave request was rejected
payroll.paidA payroll run was marked paid (totals only — never anyone's salary)
  • Answer with any 2xx status within 10 seconds; do slow work afterwards. Redirects are not followed.
  • A delivery that fails with a network error, a 5xx or a 429 is tried up to three times (at once, after 2 seconds, after 10 seconds). Other answers are not retried.
  • The same event can arrive twice — ignore an id you have already handled.
  • After 15 failed deliveries in a row the endpoint is switched off; Settings → Webhooks shows the last error and switches it back on.
  • The Send test button there (or POST /webhooks/{id}/test) sends a ping event, signed the same way.
  • Only public HTTPS addresses are accepted: no IP addresses in private ranges, no localhost or internal names.

Endpoint reference

Generated from the application code. Paths are relative to the site, e.g. https://app.finvosmart.com.

Authentication

Sign in to get an access token for every other call.

POST/api/v1/auth/loginLogin — returns access + refresh JWT tokens (the web app gets the refresh token as an HttpOnly cookie)No sign-in needed
POST/api/v1/auth/refreshRefresh access token using a valid refresh token (body, or the web app's cookie)No sign-in needed

Dashboard and analytics

The figures behind the home dashboard and the analytics page: what customers owe and what you owe, cash, the GST estimate, payroll status, statutory dates ahead, and ageing over 3, 6 or 12 months. Each part is included only for people allowed to see it.

GET/api/v1/dashboard/analyticsSales and collections by month, receivables and payables ageing, top customers, headcount and leads (3, 6 or 12 months)REPORTS_VIEW
GET/api/v1/dashboard/sectorThe tiles of the company's sector template (open projects, sales today, stock to reorder…), counted from its recordsSigned-in user
GET/api/v1/dashboard/setupWhat is set up already (company details, payment details, first customers, items, invoices, bills, team) — for the getting-started checklistSigned-in user
GET/api/v1/dashboard/summaryMoney owed and owing, cash, profit, GST, payroll, people, stock, what to do now and statutory dates aheadSigned-in user

Invoices

Create, list and update GST invoices; download PDFs; the Schedule H1 register of medicines sold on prescription.

GET/api/v1/drug-registerThe Schedule H1 register for a period (this month by default): every Schedule H1 or X medicine sold on a bill, with the patient and prescriberINVOICE_VIEW
GET/api/v1/drug-register/csvThe Schedule H1 register for a period as a spreadsheet (CSV)INVOICE_VIEW
GET/api/v1/drug-register/pdfThe Schedule H1 register for a period as a PDF, for inspectionINVOICE_VIEW
GET/api/v1/invoicesSearchSigned-in user
POST/api/v1/invoicesCreate a draft invoice (amounts and GST are worked out by the server)INVOICE_CREATE
POST/api/v1/invoices/bulk-pdfDownload up to 50 invoices as a ZIP file of PDFsINVOICE_EXPORT
GET/api/v1/invoices/dashboard/statsStatsSigned-in user
GET/api/v1/invoices/export/csvExport issued invoices of a date range as CSV (opens in Excel)INVOICE_EXPORT
POST/api/v1/invoices/payments/{paymentId}/voidVoid a payment recorded by mistake (it is kept, marked void, and reversed in the books)FINANCE_EDIT
GET/api/v1/invoices/schedule-checkFor a bill being written: which of these items are Schedule H, H1 or X medicines, and whether the customer holds a drug licenceINVOICE_VIEW or INVOICE_CREATE
GET/api/v1/invoices/{id}Get a single invoiceINVOICE_VIEW
PUT/api/v1/invoices/{id}Edit a draftINVOICE_EDIT
POST/api/v1/invoices/{id}/cancelCancel an invoice that has no payments (the sale is reversed in the books)INVOICE_DELETE or FINANCE_EDIT
POST/api/v1/invoices/{id}/convertDraft the tax invoice for a quotation, proforma or delivery challan (once; it refers back to it)INVOICE_CREATE
POST/api/v1/invoices/{id}/issueIssue a draft without sending it (e.g. handed over in person); it goes into the booksINVOICE_SEND or INVOICE_EDIT
POST/api/v1/invoices/{id}/payment-linkA card / net-banking payment link from the business's own Razorpay accountINVOICE_SEND
GET/api/v1/invoices/{id}/paymentsList paymentsINVOICE_VIEW
POST/api/v1/invoices/{id}/paymentsRecord a payment received (with any TDS the customer deducted)INVOICE_EDIT or FINANCE_CREATE
GET/api/v1/invoices/{id}/pdfThe invoice as a PDF (inline for preview; ?download=true to save)INVOICE_VIEW
POST/api/v1/invoices/{id}/remindEmail a payment reminder nowINVOICE_SEND
POST/api/v1/invoices/{id}/sendSend to the customer by email (PDF attached, view-and-pay link) and/or WhatsApp; drafts are issued firstINVOICE_SEND
PATCH/api/v1/invoices/{id}/statusOlder clients: issue (SENT), mark PAID (records a payment) or CANCELINVOICE_EDIT
GET/api/v1/public/invoices/{token}The invoice behind a view-and-pay linkSigned-in user
POST/api/v1/public/invoices/{token}/acceptThe customer accepts a quotation from its link (with their name); accepting again changes nothingSigned-in user
POST/api/v1/public/invoices/{token}/pay-onlineA card / net-banking payment link from the business's own Razorpay accountSigned-in user
GET/api/v1/public/invoices/{token}/pdfPdfSigned-in user
GET/api/v1/public/invoices/{token}/upi-qr.svgUpi qrSigned-in user
POST/api/v1/public/invoices/{token}/viewedViewedSigned-in user
POST/api/v1/public/razorpay/webhook/{companyId}Razorpay webhookSigned-in user

CRM

Customers and sales leads.

GET/api/v1/crm/customersCustomersSigned-in user
POST/api/v1/crm/customersCreate customerCRM_CREATE or CRM_ADMIN
GET/api/v1/crm/customers/{id}Get customerSigned-in user
PUT/api/v1/crm/customers/{id}Update customerCRM_EDIT or CRM_ADMIN
GET/api/v1/crm/leadsLeadsSigned-in user
POST/api/v1/crm/leadsCreate leadCRM_CREATE or CRM_ADMIN
GET/api/v1/crm/leads/myMy leadsSigned-in user
GET/api/v1/crm/leads/pipelinePipelineSigned-in user
PUT/api/v1/crm/leads/{id}Update leadCRM_CREATE or CRM_EDIT or CRM_ADMIN
POST/api/v1/crm/leads/{id}/convertConvert leadCRM_CREATE or CRM_ADMIN
PATCH/api/v1/crm/leads/{id}/statusUpdate lead statusCRM_CREATE or CRM_EDIT or CRM_ADMIN

Inventory

Items and their stock: add and edit items, record stock in and out, and read the stock ledger.

GET/api/v1/inventory/alerts/low-stockItems at or below their reorder levelSigned-in user
GET/api/v1/inventory/batches/expiringBatches in stock that expire within the days given (90 by default), and those that have expiredSigned-in user
GET/api/v1/inventory/itemsList items, by name or code and categorySigned-in user
POST/api/v1/inventory/itemsAdd an item (with its opening stock, if any)INVENTORY_CREATE or INVENTORY_ADMIN
GET/api/v1/inventory/items/{id}One item, with its stockSigned-in user
PUT/api/v1/inventory/items/{id}Edit an item's details (stock changes only through stock movements)INVENTORY_EDIT or INVENTORY_ADMIN
POST/api/v1/inventory/items/{itemId}/adjustRecord stock in, stock out or an adjustment for an itemINVENTORY_ADJUST or INVENTORY_ADMIN
GET/api/v1/inventory/items/{itemId}/batchesAn item's batches, the first to expire first, with their stockSigned-in user
GET/api/v1/inventory/items/{itemId}/ledgerAn item's stock ledgerSigned-in user
GET/api/v1/inventory/movementsThe stock ledger across items, newest firstSigned-in user
POST/api/v1/inventory/movements/recheckRe-check stock against invoices and bills and post whatever is missing (safe to repeat)INVENTORY_ADJUST or INVENTORY_ADMIN
GET/api/v1/inventory/movements/todayStock entries made today, by kindSigned-in user
POST/api/v1/inventory/stock/batchRecord several stock movements at once (scanner); each is saved or refused on its ownINVENTORY_ADJUST or INVENTORY_ADMIN
GET/api/v1/inventory/summaryThe stock at a glance: items, value at purchase price, low and below-zero stockSigned-in user

Import

Customers, suppliers, items, employees and opening balances from Excel or CSV: check a file row by row, then import it.

GET/api/v1/import/kindsWhat can be imported, the columns each file takes, and which the signed-in person may importSigned-in user
GET/api/v1/import/opening-differenceHow much of the opening balances is not yet explained (Opening Balance Difference)FINANCE_VIEW or FINANCE_CREATE
POST/api/v1/import/{kind}Import a file: all ready rows are saved together, or noneSigned-in user
POST/api/v1/import/{kind}/previewCheck a file: what each row would do (nothing is saved)Signed-in user
GET/api/v1/import/{kind}/templateThe CSV template for an import (opens in Excel)Signed-in user

Procurement

Suppliers (with MSME and TDS details) and purchase orders.

POST/api/v1/procurement/grnCreate g r nPROCUREMENT_CREATE
GET/api/v1/procurement/grn/by-po/{poId}Grns by p oSigned-in user
GET/api/v1/procurement/purchase-ordersList p osSigned-in user
POST/api/v1/procurement/purchase-ordersCreate p oPROCUREMENT_CREATE
GET/api/v1/procurement/purchase-orders/summaryPo summarySigned-in user
GET/api/v1/procurement/purchase-orders/{id}Get p oSigned-in user
PATCH/api/v1/procurement/purchase-orders/{id}/statusUpdate p o statusPROCUREMENT_CREATE or PROCUREMENT_EDIT or PROCUREMENT_APPROVE or PROCUREMENT_RECEIVE
GET/api/v1/vendorsListSigned-in user
POST/api/v1/vendorsCreatePROCUREMENT_CREATE or FINANCE_CREATE
GET/api/v1/vendors/by-gstin/{gstin}The saved supplier with this GSTINSigned-in user
GET/api/v1/vendors/{id}GetSigned-in user
PUT/api/v1/vendors/{id}UpdatePROCUREMENT_CREATE or FINANCE_CREATE

Bills and payables

Supplier bills, expenses and credit notes, payments to suppliers, and what is owed — with MSMED Act pay-by dates.

GET/api/v1/billsList bills, expenses and supplier credit notesSigned-in user
POST/api/v1/billsEnter a bill, expense or supplier credit note (as a draft, or straight into the books)Signed-in user
GET/api/v1/bills/accountsAccounts a bill line can be booked toSigned-in user
GET/api/v1/bills/export/csvPurchase register for a date range, as CSV (opens in Excel)Signed-in user
POST/api/v1/bills/payments/{paymentId}/voidVoid a mistaken payment (kept on record; its entry in the books is reversed)Signed-in user
GET/api/v1/bills/tds-suggestionThe TDS to deduct on a bill: rate, amount and the limits for the yearSigned-in user
GET/api/v1/bills/{id}One bill, expense or credit note with its lines, TDS, MSME pay-by date and GST-credit statusSigned-in user
PUT/api/v1/bills/{id}Edit a draft, or correct a recorded bill that has nothing paid against itSigned-in user
DELETE/api/v1/bills/{id}Delete a draftSigned-in user
POST/api/v1/bills/{id}/apply-creditUse a supplier credit note to settle (part of) this billSigned-in user
POST/api/v1/bills/{id}/cancelCancel a recorded bill (its entry in the books is reversed); not possible while payments stand against itSigned-in user
GET/api/v1/bills/{id}/credit-notesThe same supplier's credit notes that still have something left to useSigned-in user
GET/api/v1/bills/{id}/paymentsPayments, credit notes used and refunds on a billSigned-in user
POST/api/v1/bills/{id}/paymentsRecord a payment made against a bill (or a refund received on a supplier credit note)Signed-in user
POST/api/v1/bills/{id}/recordRecord a draft into the booksSigned-in user
GET/api/v1/payables/msmePayments to micro and small suppliers in a period: on time, late and unpaidSigned-in user
GET/api/v1/payables/msme/csvThe MSME payments report as CSV — for MSME Form I and the tax auditSigned-in user
GET/api/v1/payables/summaryTotals, ageing, what is due soon and MSME payments past the legal limitSigned-in user

Accounting

Chart of accounts, vouchers and financial reports.

GET/api/v1/finance/accountsGet accountsFINANCE_VIEW or FINANCE_REPORTS
POST/api/v1/finance/accountsCreate accountFINANCE_CREATE
PUT/api/v1/finance/accounts/{id}Update accountFINANCE_EDIT
GET/api/v1/finance/accounts/{id}/ledgerLedgerFINANCE_VIEW or FINANCE_REPORTS
GET/api/v1/finance/accounts/{id}/ledger/csvLedger csvFINANCE_VIEW or FINANCE_REPORTS
GET/api/v1/finance/accounts/{id}/ledger/pdfLedger pdfFINANCE_VIEW or FINANCE_REPORTS
GET/api/v1/finance/journal-entriesList j eFINANCE_VIEW or FINANCE_REPORTS
POST/api/v1/finance/journal-entriesCreate j eFINANCE_CREATE
GET/api/v1/finance/journal-entries/{id}Get j eFINANCE_VIEW or FINANCE_REPORTS
POST/api/v1/finance/journal-entries/{id}/reverseReverse j eFINANCE_CREATE
POST/api/v1/finance/ledger/syncSync ledgerFINANCE_CREATE
GET/api/v1/finance/reports/balance-sheetBalance sheetFINANCE_VIEW or FINANCE_REPORTS
GET/api/v1/finance/reports/profit-lossProfit and lossFINANCE_VIEW or FINANCE_REPORTS
GET/api/v1/finance/trial-balanceTrial balanceFINANCE_VIEW or FINANCE_REPORTS

GST returns

GSTR-1 and GSTR-3B for a month — summary with what to fix, the portal JSON and Excel — and the GSTR-2B input tax credit check.

GET/api/v1/gst/export/gstr1/excelGSTR-1 as an Excel workbook: summary, b2b, b2cl, b2cs, cdnr, cdnur, exemp, HSN and documents issuedSigned-in user
GET/api/v1/gst/export/gstr1/jsonGSTR-1 as the JSON file the GST portal accepts (Returns → GSTR-1 → Prepare offline → Upload)Signed-in user
GET/api/v1/gst/export/gstr3b/excelGSTR-3B worksheet, table by table, with every bill and how its credit was treatedSigned-in user
GET/api/v1/gst/export/gstr3b/jsonGSTR-3B in GSTN's JSON format (for a GST practitioner's software)Signed-in user
GET/api/v1/gst/export/summaryGSTR-1 by section and GSTR-3B by table for a month, with what to check before filingSigned-in user
GET/api/v1/gst/itc/documents/{id}One statement document, with the details needed to record it as a billSigned-in user
GET/api/v1/gst/itc/gstr2bMonths uploaded so farSigned-in user
POST/api/v1/gst/itc/gstr2bUpload a month's GSTR-2B (replaces an earlier upload of that month) and check it against the booksGST_RECON_RUN
GET/api/v1/gst/itc/gstr2b/{period}A month's statement compared with the books as they are nowSigned-in user
DELETE/api/v1/gst/itc/gstr2b/{period}Remove a month's statement; its bills go back to not checkedGST_RECON_RUN
GET/api/v1/gst/itc/gstr2b/{period}/csvThe month's check as CSV, with the suggested IMS action for each documentSigned-in user
POST/api/v1/gst/itc/gstr2b/{period}/recheckCheck the month again and update each bill's credit statusGST_RECON_RUN

TDS

The TDS register, built from supplier bills.

GET/api/v1/tds/naturesKinds of payment with their TDS rates and limitsSigned-in user
GET/api/v1/tds/registerTDS deducted on supplier bills in a period (default: this quarter), by month and kind of paymentSigned-in user
GET/api/v1/tds/register/csvThe TDS register as CSV (opens in Excel)Signed-in user

Webhooks

Register endpoints that receive event notifications.

GET/api/v1/webhooksRegistered endpoints with the outcome of their last delivery (secrets masked)SETTINGS_COMPANY or SETTINGS_VIEW
POST/api/v1/webhooksRegister an HTTPS endpoint for an event (or * for all); the answer shows its signing secret onceSigned-in user
GET/api/v1/webhooks/eventsThe events that are sentSETTINGS_COMPANY or SETTINGS_VIEW
DELETE/api/v1/webhooks/{id}Remove an endpointSigned-in user
PATCH/api/v1/webhooks/{id}/activeSwitch an endpoint on or offSigned-in user
POST/api/v1/webhooks/{id}/rotate-secretReplace the signing secret; the answer shows the new one onceSigned-in user
POST/api/v1/webhooks/{id}/testSend a test (ping) delivery nowSigned-in user

HR and payroll

Employees, attendance, leave and payroll: salary set-ups, monthly payroll runs under the labour codes, payslips, and the PF, ESI and bank files.

POST/api/v1/attendanceAdd a mark for one employee and day (older clients; use PUT /{employeeId}/{date} to change one)Signed-in user
PUT/api/v1/attendance/day/{date}Mark a day for several employees at once (days already marked are kept unless overwrite is set)Signed-in user
GET/api/v1/attendance/employee/{empId}One employee's marks between two dates (your own, without attendance rights)Signed-in user
GET/api/v1/attendance/registerThe month's attendance register: a mark per employee per day, with the unpaid days payroll will useSigned-in user
PUT/api/v1/attendance/{employeeId}/{date}Set one employee's attendance for a day (adds the mark or changes it)Signed-in user
DELETE/api/v1/attendance/{employeeId}/{date}Remove one employee's mark for a dayATTENDANCE_EDIT or ATTENDANCE_ADMIN
GET/api/v1/employeesSearch employeesSigned-in user
POST/api/v1/employeesCreate new employeeSigned-in user
GET/api/v1/employees/dashboard/statsEmployee dashboard statisticsSigned-in user
GET/api/v1/employees/{id}Get employee by IDSigned-in user
PUT/api/v1/employees/{id}Update employeeSigned-in user
DELETE/api/v1/employees/{id}Delete employee (soft)Signed-in user
PATCH/api/v1/employees/{id}/custom-fieldsUpdate custom fieldsSigned-in user
POST/api/v1/employees/{id}/resignInitiate resignationSigned-in user
POST/api/v1/leaves/applyApplyLEAVE_APPLY or LEAVE_ADMIN
GET/api/v1/leaves/decidedDecidedSigned-in user
GET/api/v1/leaves/employee/{empId}By employeeSigned-in user
GET/api/v1/leaves/myMySigned-in user
GET/api/v1/leaves/my/summaryMy summarySigned-in user
GET/api/v1/leaves/pendingPendingSigned-in user
POST/api/v1/leaves/{id}/processProcessSigned-in user
GET/api/v1/payroll/my/payslipsYour own payslipsSigned-in user
GET/api/v1/payroll/my/payslips/{itemId}/pdfDownload one of your payslips (PDF)Signed-in user
GET/api/v1/payroll/runsPayroll runs, newest month firstSigned-in user
POST/api/v1/payroll/runsStart the payroll for a month (a draft worked out from salary set-ups, attendance and leave)Signed-in user
GET/api/v1/payroll/runs/{id}A payroll run with every employee's pay, warnings and statutory due datesSigned-in user
DELETE/api/v1/payroll/runs/{id}Delete a draft payrollSigned-in user
POST/api/v1/payroll/runs/{id}/approveApprove: issue the payslips and post the payroll to the booksSigned-in user
GET/api/v1/payroll/runs/{id}/bank-fileBulk salary transfer sheet for the bank (CSV)Signed-in user
GET/api/v1/payroll/runs/{id}/ecrPF electronic challan-cum-return (ECR) text file for the EPFO portalSigned-in user
GET/api/v1/payroll/runs/{id}/esiESI monthly contribution sheet for the ESIC portal (CSV)Signed-in user
PUT/api/v1/payroll/runs/{id}/items/{itemId}Adjust one employee in a draft: unpaid days, overtime, bonus, recoveries, TDSSigned-in user
GET/api/v1/payroll/runs/{id}/items/{itemId}/payslipOne employee's payslip (PDF)Signed-in user
POST/api/v1/payroll/runs/{id}/payRecord that salaries were paid (posts Dr Salaries Payable / Cr Bank)Signed-in user
GET/api/v1/payroll/runs/{id}/payslipsEvery payslip of the run as PDFs in a ZIP fileSigned-in user
POST/api/v1/payroll/runs/{id}/recalculateBring a draft up to date with employees, salary set-ups and attendance (amounts entered by hand are kept)Signed-in user
GET/api/v1/payroll/runs/{id}/registerSalary register (CSV)Signed-in user
POST/api/v1/payroll/runs/{id}/reopenBack to draft for changes (the posting is reversed)Signed-in user
POST/api/v1/payroll/runs/{id}/unpayUndo a salary payment recorded by mistakeSigned-in user
GET/api/v1/payroll/setupEmployees with their salary set-up and what payroll still needs for themSigned-in user
POST/api/v1/payroll/setup/previewWork out a month's pay from a set-up without saving: labour-code wages, PF, ESI, PT, TDS and net paySigned-in user
GET/api/v1/payroll/setup/{employeeId}One employee's salary set-upSigned-in user
PUT/api/v1/payroll/setup/{employeeId}Save an employee's salary set-upSigned-in user

Need an endpoint that isn't listed, or higher limits? Contact us.