HR

Job offer letter PDF generator

A formal offer letter with role, start date, compensation, benefits and an acceptance block.

Send a professional offer the day a candidate says yes. This offer letter covers the role, team and manager, start date and location, compensation, benefits, offer conditions and an acceptance block for the candidate to sign.

Write one with AI, or connect your ATS or HR system and render a personalized offer for every hire from the same approved template.

Generate a Job Offer Letter 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 job offer letter per record.

curl -X POST https://pdfgen.com/api/v1/generate \
-H "Authorization: Bearer pdfg_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": {
"company": {
"name": "Northwind Studio",
"address": "120 Market St\nSan Francisco, CA 94103"
},
"date": "2026-10-28",
"candidate": {
"name": "Jordan Avery",
"firstName": "Jordan",
"address": "742 Evergreen Terrace\nPortland, OR 97201"
},
"position": "Senior Frontend Engineer",
"department": "Product Engineering",
"manager": "Dana Whitfield, Engineering Manager",
"startDate": "2026-12-01",
"workLocation": "our San Francisco office (hybrid, 3 days a week)",
"currency": "USD",
"salary": 165000,
"bonus": "Up to 10% annual performance bonus",
"employmentType": "Full-time, exempt",
"benefits": [
"Medical, dental and vision coverage from day one",
"401(k) with a 4% company match",
"20 days of paid time off plus public holidays",
"$1,500 annual learning budget"
],
"conditions": "a satisfactory background check and proof of eligibility to work in the United States",
"acceptBy": "2026-11-07",
"signatory": {
"name": "Dana Whitfield",
"title": "Engineering Manager"
}
},
"format": "A4",
"engine": "handlebars",
"html": "<div style=\"max-width:740px;margin:0 auto;padding:56px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;line-height:1.65;font-size:14px;\">\n <div style=\"display:flex;justify-content:space-between;align-items:flex-start;border-bottom:3px solid #2563eb;padding-bottom:16px;margin-bottom:28px;\">\n <div>\n <h1 style=\"font-size:22px;font-weight:800;margin:0;\">{{company.name}}</h1>\n <p style=\"margin:4px 0 0;font-size:12px;color:#6b7280;white-space:pre-line;\">{{company.address}}</p>\n </div>\n <p style=\"margin:0;font-size:12px;color:#6b7280;\">{{formatDate date}}</p>\n </div>\n <p style=\"margin:0 0 20px;\"><strong>{{candidate.name}}</strong><br><span style=\"color:#6b7280;white-space:pre-line;\">{{candidate.address}}</span></p>\n <h2 style=\"font-size:17px;font-weight:800;margin:0 0 14px;\">Offer of employment: {{position}}</h2>\n <p style=\"margin:0 0 12px;\">Dear {{candidate.firstName}},</p>\n <p style=\"margin:0 0 16px;\">We are delighted to offer you the position of <strong>{{position}}</strong> in our {{department}} team, reporting to {{manager}}. Your start date will be <strong>{{formatDate startDate}}</strong>, based at {{workLocation}}.</p>\n <table style=\"width:100%;border-collapse:collapse;font-size:13px;margin:0 0 18px;\">\n <tr style=\"background:#eff6ff;\"><td style=\"padding:9px 12px;color:#1e40af;width:40%;\">Annual base salary</td><td style=\"padding:9px 12px;font-weight:700;\">{{formatCurrency salary currency}}</td></tr>\n {{#if bonus}}<tr><td style=\"padding:9px 12px;color:#6b7280;\">Bonus</td><td style=\"padding:9px 12px;\">{{bonus}}</td></tr>{{/if}}\n <tr style=\"background:#f9fafb;\"><td style=\"padding:9px 12px;color:#6b7280;\">Employment type</td><td style=\"padding:9px 12px;\">{{employmentType}}</td></tr>\n </table>\n <p style=\"margin:0 0 6px;font-weight:700;\">Benefits</p>\n <ul style=\"margin:0 0 16px;padding-left:20px;list-style:disc;color:#374151;\">{{#each benefits}}<li>{{this}}</li>{{/each}}</ul>\n <p style=\"margin:0 0 12px;\">This offer is contingent on {{conditions}}. Please confirm your acceptance by signing below and returning this letter by <strong>{{formatDate acceptBy}}</strong>.</p>\n <p style=\"margin:0 0 28px;\">We look forward to welcoming you to {{company.name}}.</p>\n <p style=\"margin:0;\">Sincerely,</p>\n <p style=\"margin:24px 0 0;font-weight:700;\">{{signatory.name}}</p>\n <p style=\"margin:0;font-size:12px;color:#6b7280;\">{{signatory.title}}, {{company.name}}</p>\n <div style=\"margin-top:36px;border:1px dashed #cbd5e1;border-radius:8px;padding:16px;font-size:12px;color:#6b7280;\">\n I accept this offer of employment on the terms above.\n <div style=\"display:flex;gap:32px;margin-top:28px;\"><span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">{{candidate.name}}</span><span style=\"width:160px;border-top:1px solid #9ca3af;padding-top:4px;\">Date</span></div>\n </div>\n</div>"
}' --output offer-letter.pdf

Working in another language? Follow a full guide for your stack:

What you can build

  • Startups sending consistent offer letters without a template mess
  • Generating offers automatically when a candidate moves to "Hired"
  • Recruiting agencies issuing offers on behalf of clients
  • Producing localized offers for different countries

Frequently asked questions

Can I generate offer letters from my ATS?
Yes — call /api/v1/generate from your ATS webhook or workflow tool (for example Zapier) with the candidate and offer data, and attach the PDF to your email.
Can I include equity or a signing bonus?
Yes. Add rows to the compensation table, or ask the AI to add an equity section, then pass the values in your data.
Is the candidate acceptance block included?
Yes — the letter ends with an acceptance statement and lines for the candidate’s signature and date.

Related templates

Ship your job offer letter PDF endpoint today

Generate this template with AI, tweak it to match your brand, then render at scale with a single API call — no headless browsers to babysit.