Generate a Payslip PDF via the API POST your data to /api/v1/generate and get a PDF back. Copy-paste an example, swap in your API key, and loop over a list to render thousands — one payslip per record.
cURL Node.js Python
curl -X POST https://pdfgen.com/api/v1/generate \
-H "Authorization: Bearer pdfg_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"html": "<div style=\"max-width:680px;margin:0 auto;padding:44px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;\">\n <div style=\"display:flex;justify-content:space-between;align-items:flex-start;border-bottom:2px solid #111827;padding-bottom:16px;margin-bottom:24px;\">\n <div>\n <h1 style=\"font-size:20px;font-weight:800;margin:0;\">{{company.name}}</h1>\n <p style=\"color:#6b7280;margin:4px 0 0;font-size:13px;\">{{company.address}}</p>\n </div>\n <div style=\"text-align:right;\">\n <h2 style=\"font-size:16px;letter-spacing:2px;color:#4f46e5;margin:0;font-weight:800;\">PAYSLIP</h2>\n <p style=\"margin:6px 0 0;color:#6b7280;font-size:13px;\">{{period}}</p>\n </div>\n </div>\n <div style=\"display:flex;justify-content:space-between;margin-bottom:24px;font-size:13px;\">\n <div>\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1px;color:#9ca3af;margin:0 0 4px;\">Employee</p>\n <p style=\"margin:0;font-weight:600;\">{{employee.name}}</p>\n <p style=\"margin:2px 0 0;color:#6b7280;\">{{employee.title}}</p>\n </div>\n <div style=\"text-align:right;\">\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1px;color:#9ca3af;margin:0 0 4px;\">Employee ID</p>\n <p style=\"margin:0;font-weight:600;\">{{employee.id}}</p>\n <p style=\"margin:2px 0 0;color:#6b7280;\">Pay date {{formatDate payDate}}</p>\n </div>\n </div>\n <div style=\"display:flex;gap:24px;\">\n <div style=\"flex:1;\">\n <h3 style=\"font-size:12px;text-transform:uppercase;letter-spacing:1px;color:#16a34a;margin:0 0 8px;\">Earnings</h3>\n <table style=\"width:100%;font-size:13px;border-collapse:collapse;\">\n {{#each earnings}}<tr><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;\">{{label}}</td><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;text-align:right;\">{{formatCurrency amount ../currency}}</td></tr>{{/each}}\n </table>\n </div>\n <div style=\"flex:1;\">\n <h3 style=\"font-size:12px;text-transform:uppercase;letter-spacing:1px;color:#dc2626;margin:0 0 8px;\">Deductions</h3>\n <table style=\"width:100%;font-size:13px;border-collapse:collapse;\">\n {{#each deductions}}<tr><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;\">{{label}}</td><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;text-align:right;\">{{formatCurrency amount ../currency}}</td></tr>{{/each}}\n </table>\n </div>\n </div>\n <div style=\"display:flex;justify-content:space-between;align-items:center;background:#111827;color:#fff;padding:16px 24px;border-radius:10px;margin-top:28px;\">\n <span style=\"font-size:14px;\">Net pay</span>\n <span style=\"font-size:22px;font-weight:800;\">{{formatCurrency netPay currency}}</span>\n </div>\n</div>",
"engine": "handlebars",
"format": "A4",
"data": {
"company": {
"name": "Northwind Studio",
"address": "120 Market St, San Francisco, CA"
},
"period": "June 2026",
"employee": {
"name": "Jordan Avery",
"title": "Senior Product Designer",
"id": "EMP-0241"
},
"payDate": "2026-06-30",
"currency": "USD",
"earnings": [
{
"label": "Basic salary",
"amount": 6500
},
{
"label": "Housing allowance",
"amount": 800
},
{
"label": "Performance bonus",
"amount": 500
}
],
"deductions": [
{
"label": "Income tax",
"amount": 1420
},
{
"label": "Health insurance",
"amount": 210
},
{
"label": "Retirement 401(k)",
"amount": 390
}
],
"netPay": 6780
}
}' --output payslip.pdf
import fs from "node:fs" ;
const template = "<div style=\"max-width:680px;margin:0 auto;padding:44px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;\">\n <div style=\"display:flex;justify-content:space-between;align-items:flex-start;border-bottom:2px solid #111827;padding-bottom:16px;margin-bottom:24px;\">\n <div>\n <h1 style=\"font-size:20px;font-weight:800;margin:0;\">{{company.name}}</h1>\n <p style=\"color:#6b7280;margin:4px 0 0;font-size:13px;\">{{company.address}}</p>\n </div>\n <div style=\"text-align:right;\">\n <h2 style=\"font-size:16px;letter-spacing:2px;color:#4f46e5;margin:0;font-weight:800;\">PAYSLIP</h2>\n <p style=\"margin:6px 0 0;color:#6b7280;font-size:13px;\">{{period}}</p>\n </div>\n </div>\n <div style=\"display:flex;justify-content:space-between;margin-bottom:24px;font-size:13px;\">\n <div>\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1px;color:#9ca3af;margin:0 0 4px;\">Employee</p>\n <p style=\"margin:0;font-weight:600;\">{{employee.name}}</p>\n <p style=\"margin:2px 0 0;color:#6b7280;\">{{employee.title}}</p>\n </div>\n <div style=\"text-align:right;\">\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1px;color:#9ca3af;margin:0 0 4px;\">Employee ID</p>\n <p style=\"margin:0;font-weight:600;\">{{employee.id}}</p>\n <p style=\"margin:2px 0 0;color:#6b7280;\">Pay date {{formatDate payDate}}</p>\n </div>\n </div>\n <div style=\"display:flex;gap:24px;\">\n <div style=\"flex:1;\">\n <h3 style=\"font-size:12px;text-transform:uppercase;letter-spacing:1px;color:#16a34a;margin:0 0 8px;\">Earnings</h3>\n <table style=\"width:100%;font-size:13px;border-collapse:collapse;\">\n {{#each earnings}}<tr><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;\">{{label}}</td><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;text-align:right;\">{{formatCurrency amount ../currency}}</td></tr>{{/each}}\n </table>\n </div>\n <div style=\"flex:1;\">\n <h3 style=\"font-size:12px;text-transform:uppercase;letter-spacing:1px;color:#dc2626;margin:0 0 8px;\">Deductions</h3>\n <table style=\"width:100%;font-size:13px;border-collapse:collapse;\">\n {{#each deductions}}<tr><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;\">{{label}}</td><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;text-align:right;\">{{formatCurrency amount ../currency}}</td></tr>{{/each}}\n </table>\n </div>\n </div>\n <div style=\"display:flex;justify-content:space-between;align-items:center;background:#111827;color:#fff;padding:16px 24px;border-radius:10px;margin-top:28px;\">\n <span style=\"font-size:14px;\">Net pay</span>\n <span style=\"font-size:22px;font-weight:800;\">{{formatCurrency netPay currency}}</span>\n </div>\n</div>" ;
const res = await fetch ( "https://pdfgen.com/api/v1/generate" , {
method : "POST" ,
headers : {
Authorization : "Bearer pdfg_live_xxx" ,
"Content-Type" : "application/json" ,
} ,
body : JSON . stringify ( {
html : template ,
engine : "handlebars" ,
format : "A4" ,
data : {
"company" : {
"name" : "Northwind Studio" ,
"address" : "120 Market St, San Francisco, CA"
} ,
"period" : "June 2026" ,
"employee" : {
"name" : "Jordan Avery" ,
"title" : "Senior Product Designer" ,
"id" : "EMP-0241"
} ,
"payDate" : "2026-06-30" ,
"currency" : "USD" ,
"earnings" : [
{
"label" : "Basic salary" ,
"amount" : 6500
} ,
{
"label" : "Housing allowance" ,
"amount" : 800
} ,
{
"label" : "Performance bonus" ,
"amount" : 500
}
] ,
"deductions" : [
{
"label" : "Income tax" ,
"amount" : 1420
} ,
{
"label" : "Health insurance" ,
"amount" : 210
} ,
{
"label" : "Retirement 401(k)" ,
"amount" : 390
}
] ,
"netPay" : 6780
} ,
} ) ,
} ) ;
fs . writeFileSync ( "payslip.pdf" , Buffer . from ( await res . arrayBuffer ( ) ) ) ;
import requests
template = "<div style=\"max-width:680px;margin:0 auto;padding:44px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;\">\n <div style=\"display:flex;justify-content:space-between;align-items:flex-start;border-bottom:2px solid #111827;padding-bottom:16px;margin-bottom:24px;\">\n <div>\n <h1 style=\"font-size:20px;font-weight:800;margin:0;\">{{company.name}}</h1>\n <p style=\"color:#6b7280;margin:4px 0 0;font-size:13px;\">{{company.address}}</p>\n </div>\n <div style=\"text-align:right;\">\n <h2 style=\"font-size:16px;letter-spacing:2px;color:#4f46e5;margin:0;font-weight:800;\">PAYSLIP</h2>\n <p style=\"margin:6px 0 0;color:#6b7280;font-size:13px;\">{{period}}</p>\n </div>\n </div>\n <div style=\"display:flex;justify-content:space-between;margin-bottom:24px;font-size:13px;\">\n <div>\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1px;color:#9ca3af;margin:0 0 4px;\">Employee</p>\n <p style=\"margin:0;font-weight:600;\">{{employee.name}}</p>\n <p style=\"margin:2px 0 0;color:#6b7280;\">{{employee.title}}</p>\n </div>\n <div style=\"text-align:right;\">\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1px;color:#9ca3af;margin:0 0 4px;\">Employee ID</p>\n <p style=\"margin:0;font-weight:600;\">{{employee.id}}</p>\n <p style=\"margin:2px 0 0;color:#6b7280;\">Pay date {{formatDate payDate}}</p>\n </div>\n </div>\n <div style=\"display:flex;gap:24px;\">\n <div style=\"flex:1;\">\n <h3 style=\"font-size:12px;text-transform:uppercase;letter-spacing:1px;color:#16a34a;margin:0 0 8px;\">Earnings</h3>\n <table style=\"width:100%;font-size:13px;border-collapse:collapse;\">\n {{#each earnings}}<tr><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;\">{{label}}</td><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;text-align:right;\">{{formatCurrency amount ../currency}}</td></tr>{{/each}}\n </table>\n </div>\n <div style=\"flex:1;\">\n <h3 style=\"font-size:12px;text-transform:uppercase;letter-spacing:1px;color:#dc2626;margin:0 0 8px;\">Deductions</h3>\n <table style=\"width:100%;font-size:13px;border-collapse:collapse;\">\n {{#each deductions}}<tr><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;\">{{label}}</td><td style=\"padding:6px 0;border-bottom:1px solid #f3f4f6;text-align:right;\">{{formatCurrency amount ../currency}}</td></tr>{{/each}}\n </table>\n </div>\n </div>\n <div style=\"display:flex;justify-content:space-between;align-items:center;background:#111827;color:#fff;padding:16px 24px;border-radius:10px;margin-top:28px;\">\n <span style=\"font-size:14px;\">Net pay</span>\n <span style=\"font-size:22px;font-weight:800;\">{{formatCurrency netPay currency}}</span>\n </div>\n</div>"
res = requests . post (
"https://pdfgen.com/api/v1/generate" ,
headers = { "Authorization" : "Bearer pdfg_live_xxx" } ,
json = {
"html" : template ,
"engine" : "handlebars" ,
"format" : "A4" ,
"data" : {
"company" : {
"name" : "Northwind Studio" ,
"address" : "120 Market St, San Francisco, CA"
} ,
"period" : "June 2026" ,
"employee" : {
"name" : "Jordan Avery" ,
"title" : "Senior Product Designer" ,
"id" : "EMP-0241"
} ,
"payDate" : "2026-06-30" ,
"currency" : "USD" ,
"earnings" : [
{
"label" : "Basic salary" ,
"amount" : 6500
} ,
{
"label" : "Housing allowance" ,
"amount" : 800
} ,
{
"label" : "Performance bonus" ,
"amount" : 500
}
] ,
"deductions" : [
{
"label" : "Income tax" ,
"amount" : 1420
} ,
{
"label" : "Health insurance" ,
"amount" : 210
} ,
{
"label" : "Retirement 401(k)" ,
"amount" : 390
}
] ,
"netPay" : 6780
} ,
} ,
)
with open ( "payslip.pdf" , "wb" ) as f :
f . write ( res . content )
Working in another language? Follow a full guide for your stack: