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 indata. - Lists that can grow are paged: pass
page(from 0) andsize; readcontent,totalElementsandtotalPages. - 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.issued | An invoice was issued (it left draft) |
| invoice.paid | An invoice was paid in full |
| invoice.overdue | An invoice passed its due date unpaid |
| invoice.cancelled | An invoice was cancelled |
| quotation.accepted | A customer accepted a quotation from its link |
| payment.received | A customer payment was recorded |
| customer.created | A customer was added |
| bill.recorded | A supplier bill or expense was recorded |
| bill.paid | A supplier bill was paid in full |
| purchase_order.approved | A purchase order was approved |
| leave.approved | A leave request was approved |
| leave.rejected | A leave request was rejected |
| payroll.paid | A 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
idyou 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 apingevent, signed the same way. - Only public HTTPS addresses are accepted: no IP addresses in private ranges, no
localhostor 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/login | Login — returns access + refresh JWT tokens (the web app gets the refresh token as an HttpOnly cookie) | No sign-in needed |
| POST | /api/v1/auth/refresh | Refresh 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/analytics | Sales and collections by month, receivables and payables ageing, top customers, headcount and leads (3, 6 or 12 months) | REPORTS_VIEW |
| GET | /api/v1/dashboard/sector | The tiles of the company's sector template (open projects, sales today, stock to reorder…), counted from its records | Signed-in user |
| GET | /api/v1/dashboard/setup | What is set up already (company details, payment details, first customers, items, invoices, bills, team) — for the getting-started checklist | Signed-in user |
| GET | /api/v1/dashboard/summary | Money owed and owing, cash, profit, GST, payroll, people, stock, what to do now and statutory dates ahead | Signed-in user |
Invoices
Create, list and update GST invoices; download PDFs; the Schedule H1 register of medicines sold on prescription.
| GET | /api/v1/drug-register | The Schedule H1 register for a period (this month by default): every Schedule H1 or X medicine sold on a bill, with the patient and prescriber | INVOICE_VIEW |
| GET | /api/v1/drug-register/csv | The Schedule H1 register for a period as a spreadsheet (CSV) | INVOICE_VIEW |
| GET | /api/v1/drug-register/pdf | The Schedule H1 register for a period as a PDF, for inspection | INVOICE_VIEW |
| GET | /api/v1/invoices | Search | Signed-in user |
| POST | /api/v1/invoices | Create a draft invoice (amounts and GST are worked out by the server) | INVOICE_CREATE |
| POST | /api/v1/invoices/bulk-pdf | Download up to 50 invoices as a ZIP file of PDFs | INVOICE_EXPORT |
| GET | /api/v1/invoices/dashboard/stats | Stats | Signed-in user |
| GET | /api/v1/invoices/export/csv | Export issued invoices of a date range as CSV (opens in Excel) | INVOICE_EXPORT |
| POST | /api/v1/invoices/payments/{paymentId}/void | Void a payment recorded by mistake (it is kept, marked void, and reversed in the books) | FINANCE_EDIT |
| GET | /api/v1/invoices/schedule-check | For a bill being written: which of these items are Schedule H, H1 or X medicines, and whether the customer holds a drug licence | INVOICE_VIEW or INVOICE_CREATE |
| GET | /api/v1/invoices/{id} | Get a single invoice | INVOICE_VIEW |
| PUT | /api/v1/invoices/{id} | Edit a draft | INVOICE_EDIT |
| POST | /api/v1/invoices/{id}/cancel | Cancel an invoice that has no payments (the sale is reversed in the books) | INVOICE_DELETE or FINANCE_EDIT |
| POST | /api/v1/invoices/{id}/convert | Draft the tax invoice for a quotation, proforma or delivery challan (once; it refers back to it) | INVOICE_CREATE |
| POST | /api/v1/invoices/{id}/issue | Issue a draft without sending it (e.g. handed over in person); it goes into the books | INVOICE_SEND or INVOICE_EDIT |
| POST | /api/v1/invoices/{id}/payment-link | A card / net-banking payment link from the business's own Razorpay account | INVOICE_SEND |
| GET | /api/v1/invoices/{id}/payments | List payments | INVOICE_VIEW |
| POST | /api/v1/invoices/{id}/payments | Record a payment received (with any TDS the customer deducted) | INVOICE_EDIT or FINANCE_CREATE |
| GET | /api/v1/invoices/{id}/pdf | The invoice as a PDF (inline for preview; ?download=true to save) | INVOICE_VIEW |
| POST | /api/v1/invoices/{id}/remind | Email a payment reminder now | INVOICE_SEND |
| POST | /api/v1/invoices/{id}/send | Send to the customer by email (PDF attached, view-and-pay link) and/or WhatsApp; drafts are issued first | INVOICE_SEND |
| PATCH | /api/v1/invoices/{id}/status | Older clients: issue (SENT), mark PAID (records a payment) or CANCEL | INVOICE_EDIT |
| GET | /api/v1/public/invoices/{token} | The invoice behind a view-and-pay link | Signed-in user |
| POST | /api/v1/public/invoices/{token}/accept | The customer accepts a quotation from its link (with their name); accepting again changes nothing | Signed-in user |
| POST | /api/v1/public/invoices/{token}/pay-online | A card / net-banking payment link from the business's own Razorpay account | Signed-in user |
| GET | /api/v1/public/invoices/{token}/pdf | Signed-in user | |
| GET | /api/v1/public/invoices/{token}/upi-qr.svg | Upi qr | Signed-in user |
| POST | /api/v1/public/invoices/{token}/viewed | Viewed | Signed-in user |
| POST | /api/v1/public/razorpay/webhook/{companyId} | Razorpay webhook | Signed-in user |
CRM
Customers and sales leads.
| GET | /api/v1/crm/customers | Customers | Signed-in user |
| POST | /api/v1/crm/customers | Create customer | CRM_CREATE or CRM_ADMIN |
| GET | /api/v1/crm/customers/{id} | Get customer | Signed-in user |
| PUT | /api/v1/crm/customers/{id} | Update customer | CRM_EDIT or CRM_ADMIN |
| GET | /api/v1/crm/leads | Leads | Signed-in user |
| POST | /api/v1/crm/leads | Create lead | CRM_CREATE or CRM_ADMIN |
| GET | /api/v1/crm/leads/my | My leads | Signed-in user |
| GET | /api/v1/crm/leads/pipeline | Pipeline | Signed-in user |
| PUT | /api/v1/crm/leads/{id} | Update lead | CRM_CREATE or CRM_EDIT or CRM_ADMIN |
| POST | /api/v1/crm/leads/{id}/convert | Convert lead | CRM_CREATE or CRM_ADMIN |
| PATCH | /api/v1/crm/leads/{id}/status | Update lead status | CRM_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-stock | Items at or below their reorder level | Signed-in user |
| GET | /api/v1/inventory/batches/expiring | Batches in stock that expire within the days given (90 by default), and those that have expired | Signed-in user |
| GET | /api/v1/inventory/items | List items, by name or code and category | Signed-in user |
| POST | /api/v1/inventory/items | Add an item (with its opening stock, if any) | INVENTORY_CREATE or INVENTORY_ADMIN |
| GET | /api/v1/inventory/items/{id} | One item, with its stock | Signed-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}/adjust | Record stock in, stock out or an adjustment for an item | INVENTORY_ADJUST or INVENTORY_ADMIN |
| GET | /api/v1/inventory/items/{itemId}/batches | An item's batches, the first to expire first, with their stock | Signed-in user |
| GET | /api/v1/inventory/items/{itemId}/ledger | An item's stock ledger | Signed-in user |
| GET | /api/v1/inventory/movements | The stock ledger across items, newest first | Signed-in user |
| POST | /api/v1/inventory/movements/recheck | Re-check stock against invoices and bills and post whatever is missing (safe to repeat) | INVENTORY_ADJUST or INVENTORY_ADMIN |
| GET | /api/v1/inventory/movements/today | Stock entries made today, by kind | Signed-in user |
| POST | /api/v1/inventory/stock/batch | Record several stock movements at once (scanner); each is saved or refused on its own | INVENTORY_ADJUST or INVENTORY_ADMIN |
| GET | /api/v1/inventory/summary | The stock at a glance: items, value at purchase price, low and below-zero stock | Signed-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/kinds | What can be imported, the columns each file takes, and which the signed-in person may import | Signed-in user |
| GET | /api/v1/import/opening-difference | How 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 none | Signed-in user |
| POST | /api/v1/import/{kind}/preview | Check a file: what each row would do (nothing is saved) | Signed-in user |
| GET | /api/v1/import/{kind}/template | The 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/grn | Create g r n | PROCUREMENT_CREATE |
| GET | /api/v1/procurement/grn/by-po/{poId} | Grns by p o | Signed-in user |
| GET | /api/v1/procurement/purchase-orders | List p os | Signed-in user |
| POST | /api/v1/procurement/purchase-orders | Create p o | PROCUREMENT_CREATE |
| GET | /api/v1/procurement/purchase-orders/summary | Po summary | Signed-in user |
| GET | /api/v1/procurement/purchase-orders/{id} | Get p o | Signed-in user |
| PATCH | /api/v1/procurement/purchase-orders/{id}/status | Update p o status | PROCUREMENT_CREATE or PROCUREMENT_EDIT or PROCUREMENT_APPROVE or PROCUREMENT_RECEIVE |
| GET | /api/v1/vendors | List | Signed-in user |
| POST | /api/v1/vendors | Create | PROCUREMENT_CREATE or FINANCE_CREATE |
| GET | /api/v1/vendors/by-gstin/{gstin} | The saved supplier with this GSTIN | Signed-in user |
| GET | /api/v1/vendors/{id} | Get | Signed-in user |
| PUT | /api/v1/vendors/{id} | Update | PROCUREMENT_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/bills | List bills, expenses and supplier credit notes | Signed-in user |
| POST | /api/v1/bills | Enter a bill, expense or supplier credit note (as a draft, or straight into the books) | Signed-in user |
| GET | /api/v1/bills/accounts | Accounts a bill line can be booked to | Signed-in user |
| GET | /api/v1/bills/export/csv | Purchase register for a date range, as CSV (opens in Excel) | Signed-in user |
| POST | /api/v1/bills/payments/{paymentId}/void | Void a mistaken payment (kept on record; its entry in the books is reversed) | Signed-in user |
| GET | /api/v1/bills/tds-suggestion | The TDS to deduct on a bill: rate, amount and the limits for the year | Signed-in user |
| GET | /api/v1/bills/{id} | One bill, expense or credit note with its lines, TDS, MSME pay-by date and GST-credit status | Signed-in user |
| PUT | /api/v1/bills/{id} | Edit a draft, or correct a recorded bill that has nothing paid against it | Signed-in user |
| DELETE | /api/v1/bills/{id} | Delete a draft | Signed-in user |
| POST | /api/v1/bills/{id}/apply-credit | Use a supplier credit note to settle (part of) this bill | Signed-in user |
| POST | /api/v1/bills/{id}/cancel | Cancel a recorded bill (its entry in the books is reversed); not possible while payments stand against it | Signed-in user |
| GET | /api/v1/bills/{id}/credit-notes | The same supplier's credit notes that still have something left to use | Signed-in user |
| GET | /api/v1/bills/{id}/payments | Payments, credit notes used and refunds on a bill | Signed-in user |
| POST | /api/v1/bills/{id}/payments | Record a payment made against a bill (or a refund received on a supplier credit note) | Signed-in user |
| POST | /api/v1/bills/{id}/record | Record a draft into the books | Signed-in user |
| GET | /api/v1/payables/msme | Payments to micro and small suppliers in a period: on time, late and unpaid | Signed-in user |
| GET | /api/v1/payables/msme/csv | The MSME payments report as CSV — for MSME Form I and the tax audit | Signed-in user |
| GET | /api/v1/payables/summary | Totals, ageing, what is due soon and MSME payments past the legal limit | Signed-in user |
Accounting
Chart of accounts, vouchers and financial reports.
| GET | /api/v1/finance/accounts | Get accounts | FINANCE_VIEW or FINANCE_REPORTS |
| POST | /api/v1/finance/accounts | Create account | FINANCE_CREATE |
| PUT | /api/v1/finance/accounts/{id} | Update account | FINANCE_EDIT |
| GET | /api/v1/finance/accounts/{id}/ledger | Ledger | FINANCE_VIEW or FINANCE_REPORTS |
| GET | /api/v1/finance/accounts/{id}/ledger/csv | Ledger csv | FINANCE_VIEW or FINANCE_REPORTS |
| GET | /api/v1/finance/accounts/{id}/ledger/pdf | Ledger pdf | FINANCE_VIEW or FINANCE_REPORTS |
| GET | /api/v1/finance/journal-entries | List j e | FINANCE_VIEW or FINANCE_REPORTS |
| POST | /api/v1/finance/journal-entries | Create j e | FINANCE_CREATE |
| GET | /api/v1/finance/journal-entries/{id} | Get j e | FINANCE_VIEW or FINANCE_REPORTS |
| POST | /api/v1/finance/journal-entries/{id}/reverse | Reverse j e | FINANCE_CREATE |
| POST | /api/v1/finance/ledger/sync | Sync ledger | FINANCE_CREATE |
| GET | /api/v1/finance/reports/balance-sheet | Balance sheet | FINANCE_VIEW or FINANCE_REPORTS |
| GET | /api/v1/finance/reports/profit-loss | Profit and loss | FINANCE_VIEW or FINANCE_REPORTS |
| GET | /api/v1/finance/trial-balance | Trial balance | FINANCE_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/excel | GSTR-1 as an Excel workbook: summary, b2b, b2cl, b2cs, cdnr, cdnur, exemp, HSN and documents issued | Signed-in user |
| GET | /api/v1/gst/export/gstr1/json | GSTR-1 as the JSON file the GST portal accepts (Returns → GSTR-1 → Prepare offline → Upload) | Signed-in user |
| GET | /api/v1/gst/export/gstr3b/excel | GSTR-3B worksheet, table by table, with every bill and how its credit was treated | Signed-in user |
| GET | /api/v1/gst/export/gstr3b/json | GSTR-3B in GSTN's JSON format (for a GST practitioner's software) | Signed-in user |
| GET | /api/v1/gst/export/summary | GSTR-1 by section and GSTR-3B by table for a month, with what to check before filing | Signed-in user |
| GET | /api/v1/gst/itc/documents/{id} | One statement document, with the details needed to record it as a bill | Signed-in user |
| GET | /api/v1/gst/itc/gstr2b | Months uploaded so far | Signed-in user |
| POST | /api/v1/gst/itc/gstr2b | Upload a month's GSTR-2B (replaces an earlier upload of that month) and check it against the books | GST_RECON_RUN |
| GET | /api/v1/gst/itc/gstr2b/{period} | A month's statement compared with the books as they are now | Signed-in user |
| DELETE | /api/v1/gst/itc/gstr2b/{period} | Remove a month's statement; its bills go back to not checked | GST_RECON_RUN |
| GET | /api/v1/gst/itc/gstr2b/{period}/csv | The month's check as CSV, with the suggested IMS action for each document | Signed-in user |
| POST | /api/v1/gst/itc/gstr2b/{period}/recheck | Check the month again and update each bill's credit status | GST_RECON_RUN |
TDS
The TDS register, built from supplier bills.
| GET | /api/v1/tds/natures | Kinds of payment with their TDS rates and limits | Signed-in user |
| GET | /api/v1/tds/register | TDS deducted on supplier bills in a period (default: this quarter), by month and kind of payment | Signed-in user |
| GET | /api/v1/tds/register/csv | The TDS register as CSV (opens in Excel) | Signed-in user |
Webhooks
Register endpoints that receive event notifications.
| GET | /api/v1/webhooks | Registered endpoints with the outcome of their last delivery (secrets masked) | SETTINGS_COMPANY or SETTINGS_VIEW |
| POST | /api/v1/webhooks | Register an HTTPS endpoint for an event (or * for all); the answer shows its signing secret once | Signed-in user |
| GET | /api/v1/webhooks/events | The events that are sent | SETTINGS_COMPANY or SETTINGS_VIEW |
| DELETE | /api/v1/webhooks/{id} | Remove an endpoint | Signed-in user |
| PATCH | /api/v1/webhooks/{id}/active | Switch an endpoint on or off | Signed-in user |
| POST | /api/v1/webhooks/{id}/rotate-secret | Replace the signing secret; the answer shows the new one once | Signed-in user |
| POST | /api/v1/webhooks/{id}/test | Send a test (ping) delivery now | Signed-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/attendance | Add 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/register | The month's attendance register: a mark per employee per day, with the unpaid days payroll will use | Signed-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 day | ATTENDANCE_EDIT or ATTENDANCE_ADMIN |
| GET | /api/v1/employees | Search employees | Signed-in user |
| POST | /api/v1/employees | Create new employee | Signed-in user |
| GET | /api/v1/employees/dashboard/stats | Employee dashboard statistics | Signed-in user |
| GET | /api/v1/employees/{id} | Get employee by ID | Signed-in user |
| PUT | /api/v1/employees/{id} | Update employee | Signed-in user |
| DELETE | /api/v1/employees/{id} | Delete employee (soft) | Signed-in user |
| PATCH | /api/v1/employees/{id}/custom-fields | Update custom fields | Signed-in user |
| POST | /api/v1/employees/{id}/resign | Initiate resignation | Signed-in user |
| POST | /api/v1/leaves/apply | Apply | LEAVE_APPLY or LEAVE_ADMIN |
| GET | /api/v1/leaves/decided | Decided | Signed-in user |
| GET | /api/v1/leaves/employee/{empId} | By employee | Signed-in user |
| GET | /api/v1/leaves/my | My | Signed-in user |
| GET | /api/v1/leaves/my/summary | My summary | Signed-in user |
| GET | /api/v1/leaves/pending | Pending | Signed-in user |
| POST | /api/v1/leaves/{id}/process | Process | Signed-in user |
| GET | /api/v1/payroll/my/payslips | Your own payslips | Signed-in user |
| GET | /api/v1/payroll/my/payslips/{itemId}/pdf | Download one of your payslips (PDF) | Signed-in user |
| GET | /api/v1/payroll/runs | Payroll runs, newest month first | Signed-in user |
| POST | /api/v1/payroll/runs | Start 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 dates | Signed-in user |
| DELETE | /api/v1/payroll/runs/{id} | Delete a draft payroll | Signed-in user |
| POST | /api/v1/payroll/runs/{id}/approve | Approve: issue the payslips and post the payroll to the books | Signed-in user |
| GET | /api/v1/payroll/runs/{id}/bank-file | Bulk salary transfer sheet for the bank (CSV) | Signed-in user |
| GET | /api/v1/payroll/runs/{id}/ecr | PF electronic challan-cum-return (ECR) text file for the EPFO portal | Signed-in user |
| GET | /api/v1/payroll/runs/{id}/esi | ESI 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, TDS | Signed-in user |
| GET | /api/v1/payroll/runs/{id}/items/{itemId}/payslip | One employee's payslip (PDF) | Signed-in user |
| POST | /api/v1/payroll/runs/{id}/pay | Record that salaries were paid (posts Dr Salaries Payable / Cr Bank) | Signed-in user |
| GET | /api/v1/payroll/runs/{id}/payslips | Every payslip of the run as PDFs in a ZIP file | Signed-in user |
| POST | /api/v1/payroll/runs/{id}/recalculate | Bring 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}/register | Salary register (CSV) | Signed-in user |
| POST | /api/v1/payroll/runs/{id}/reopen | Back to draft for changes (the posting is reversed) | Signed-in user |
| POST | /api/v1/payroll/runs/{id}/unpay | Undo a salary payment recorded by mistake | Signed-in user |
| GET | /api/v1/payroll/setup | Employees with their salary set-up and what payroll still needs for them | Signed-in user |
| POST | /api/v1/payroll/setup/preview | Work out a month's pay from a set-up without saving: labour-code wages, PF, ESI, PT, TDS and net pay | Signed-in user |
| GET | /api/v1/payroll/setup/{employeeId} | One employee's salary set-up | Signed-in user |
| PUT | /api/v1/payroll/setup/{employeeId} | Save an employee's salary set-up | Signed-in user |
Need an endpoint that isn't listed, or higher limits? Contact us.