HR & People
Payslip
Pay statement — earnings and deductions side by side, net pay, and YTD figures. Every number comes from the payroll system.
The contract
Fields your API call provides. Amounts and totals are always computed by the caller — templates only format.
| net_pay | number | required |
| ytd_net | number | required |
| earnings[].label | string | required |
| earnings[].amount | number | required |
| employee.id | string | required |
| employee.name | string | required |
| employee.title | string | required |
| employer.name | string | required |
| employer.address | string | required |
| pay_date | string | required |
| gross_pay | number | required |
| ytd_gross | number | required |
| deductions[].label | string | required |
| deductions[].amount | number | required |
| period_end | string | required |
| period_start | string | required |
| total_deductions | number | required |
MCP-ready: forks of this template will expose generate_payslip when the MCP server ships.
Generate it (after you fork & publish)
curl -X POST https://your-paperbrain-host/api/generate/gen_<your-id> \
-H "Content-Type: application/json" \
-d '{
"net_pay": 4806,
"ytd_net": 52866,
"earnings": [
{
"label": "Base salary",
"amount": 8250
},
{
"label": "On-call stipend",
"amount": 250
}
],
"employee": {
"id": "EMP-0214",
"name": "Jordan Reyes",
"title": "Senior Product Engineer"
},
"employer": {
"name": "Lumen Labs",
"address": "550 Mission Street, Floor 12, San Francisco, CA 94105"
},
"pay_date": "2026-06-01",
"gross_pay": 8500,
"ytd_gross": 93500,
"deductions": [
{
"label": "Federal income tax",
"amount": 1842.5
},
{
"label": "State income tax (CA)",
"amount": 691.25
},
{
"label": "Social Security & Medicare",
"amount": 650.25
},
{
"label": "401(k) contribution (6%)",
"amount": 510
}
],
"period_end": "2026-05-31",
"period_start": "2026-05-16",
"total_deductions": 3694
}'gen_<your-id>is your generator's id once you fork and publish. The body shown is this template's sample data — the exact shape the contract validates.