Independence Day offer · ₹52/employee/moClaim offer
INDPayroll
Payroll Engine API

Run Indian payroll from inside your own product.

A REST API over the INDPayroll engine: employees and salary structures, the attendance and leave a period is built from, payroll runs, payslips, bank files, and the PF, ESI, professional tax, LWF and TDS returns that follow. JSON in, JSON out - or a filing-ready file when you ask for one.

Base URLhttps://api.indpayroll.com/v1

What the engine does

INDPayroll calculates Indian payroll: it spreads a CTC across a salary structure, pro-rates it against attendance and leave, applies PF, ESI, professional tax, TDS and LWF as the statute defines them, and produces payslips, bank files and filing-ready returns. The API exposes all of it - the same engine the product runs on, with no screen in the way.

There are 171 endpoints across 14 groups. You will not need most of them: a calculate-only integration uses one.

Two ways to integrate

Calculate onlyEmbed the engine
You holdEmployees, attendance, everything.Your own UI; INDPayroll holds the payroll data.
You callPOST /payroll-runs/preview with the inputs inline.Employees, inputs, then create, calculate, lock and mark paid.
We storeNothing. No run, no payslip, no id.Runs, payslips, statutory files, the audit trail.
You getFully calculated slips as JSON.Slips, PDFs, bank files, ECR, 24Q, FnF, reports.

Both shapes use the same objects and the same calculation. Start with preview whichever you are building - it is the fastest way to see a real number.

Base URLs

EnvironmentBase URLKeys
Productionhttps://api.indpayroll.com/v1indp_live_...
Sandboxhttps://sandbox-api.indpayroll.com/v1indp_test_...

Sandbox is the same engine over synthetic organizations, and nothing is ever submitted to EPFO, ESIC or TRACES from it. Build there first.

Your first call

GET /me proves the key works and tells you which organizations it can reach - the organization_id every other call wants.

Request
curl https://sandbox-api.indpayroll.com/v1/me \
  -H "Authorization: Bearer $INDP_API_KEY" \
  -H "INDP-Version: 2026-09-01"
Response
{
  "key_id": "indp_test_9f2c41ab",
  "mode": "sandbox",
  "company": { "id": 17, "name": "Acme Technologies Private Limited" },
  "scopes": ["org:read", "employees:write", "payroll:write", "statutory:read"],
  "organization_ids": [42],
  "rate_limits": { "requests_per_minute": 600, "payroll_runs_per_hour": 60 },
  "api_version": "2026-09-01"
}

Conventions

How it works
MoneyA decimal number of rupees to two places - 82654.67, never paise integers.
DatesYYYY-MM-DD. Timestamps are RFC 3339 in UTC.
Employee idsINDPayroll's id, or your own prefixed with ext: - /employees/ext:emp-1001. Upserts match on external_id.
Lists{ data, meta }, with page and per_page. See Pagination and formats.
Errors{ error } with a stable code and a request_id. See Errors.
RetriesSend an Idempotency-Key on every mutating call. See Idempotency.
FilesReports and statutory endpoints take ?format= with xlsx, csv, txt or pdf.

Before you start

  • A sandbox key pair from the partner console.
  • An organization with its statutory identifiers set - PF code, ESI code, PAN, TAN and a PT state. Statutory output is only as good as these.
  • A salary structure: components, and a salary group that arranges them.
  • Somewhere to receive webhooks, if you would rather not poll.
Ahead of general availabilityThe Payroll Engine API is documented here for partners building against the contract. Talk to us at /contact before you ship - we will get you keys and walk your integration.

Endpoint groups