Texify

Letters

Offer letter PDF API

Offer letter template for HR workflows and hiring platforms. Keeps compensation, start date, signature, and legal paragraphs in a tidy PDF layout. Send this LaTeX template and JSON data to Texify in one /render request.

Offer letter PDF preview

JSON schema

Fields this template expects.

FieldTypeRequiredDescription
senderobjectYesSender name and address.
recipientobjectYesRecipient name and address.
datestringYesLetter date.
subjectstringYesSubject line.
bodyarrayYesParagraphs rendered as letter body.

API examples

POST LaTeX and JSON. Receive PDF bytes.

curl
cat > offer-letter-payload.json <<'JSON'
{
  "entrypoint": "main.tex",
  "resources": {
    "main.tex": "\\documentclass[11pt]{article}\n\\usepackage[margin=0.85in]{geometry}\n\\pagestyle{empty}\n\\begin{document}\n\\noindent [[ .sender.name ]]\\\\\n[[ .sender.address ]]\\\\[0.25in]\n[[ .date ]]\\\\[0.25in]\n\\noindent [[ .recipient.name ]]\\\\\n[[ .recipient.address ]]\\\\[0.25in]\n\\noindent\\textbf{Re: [[ .subject ]]}\\\\[0.2in]\n[[ range .body ]]\\noindent [[ . ]]\\\\[0.14in]\n[[ end ]]\n[[ with .compensation ]]\\noindent\\textbf{Compensation:} [[ . ]]\\\\[0.18in][[ end ]]\n\\noindent Sincerely,\\\\[0.35in]\n[[ with .signer ]][[ . ]][[ else ]][[ .sender.name ]][[ end ]]\n\\end{document}"
  },
  "data": {
    "sender": {
      "name": "Orbit AI",
      "address": "44 Market St, SF"
    },
    "recipient": {
      "name": "Mina Chen",
      "address": "Austin, TX"
    },
    "date": "2026-07-07",
    "subject": "Offer for Senior Engineer",
    "body": [
      "We are pleased to offer you the role of Senior Engineer.",
      "Your anticipated start date is 2026-08-12."
    ],
    "signer": null,
    "compensation": "$185,000 base salary"
  }
}
JSON

curl -sS -X POST https://api.texify.dev/render \
  -H "Content-Type: application/json" \
  --data @offer-letter-payload.json \
  --output offer-letter.pdf
Python
import json
import requests

payload = json.loads(r'''{
  "entrypoint": "main.tex",
  "resources": {
    "main.tex": "\\documentclass[11pt]{article}\n\\usepackage[margin=0.85in]{geometry}\n\\pagestyle{empty}\n\\begin{document}\n\\noindent [[ .sender.name ]]\\\\\n[[ .sender.address ]]\\\\[0.25in]\n[[ .date ]]\\\\[0.25in]\n\\noindent [[ .recipient.name ]]\\\\\n[[ .recipient.address ]]\\\\[0.25in]\n\\noindent\\textbf{Re: [[ .subject ]]}\\\\[0.2in]\n[[ range .body ]]\\noindent [[ . ]]\\\\[0.14in]\n[[ end ]]\n[[ with .compensation ]]\\noindent\\textbf{Compensation:} [[ . ]]\\\\[0.18in][[ end ]]\n\\noindent Sincerely,\\\\[0.35in]\n[[ with .signer ]][[ . ]][[ else ]][[ .sender.name ]][[ end ]]\n\\end{document}"
  },
  "data": {
    "sender": {
      "name": "Orbit AI",
      "address": "44 Market St, SF"
    },
    "recipient": {
      "name": "Mina Chen",
      "address": "Austin, TX"
    },
    "date": "2026-07-07",
    "subject": "Offer for Senior Engineer",
    "body": [
      "We are pleased to offer you the role of Senior Engineer.",
      "Your anticipated start date is 2026-08-12."
    ],
    "signer": null,
    "compensation": "$185,000 base salary"
  }
}''')
response = requests.post(
    "https://api.texify.dev/render",
    json=payload,
    timeout=90,
)
response.raise_for_status()

with open("offer-letter.pdf", "wb") as pdf:
    pdf.write(response.content)
Node fetch
import { writeFile } from "node:fs/promises";

const payload = {
  "entrypoint": "main.tex",
  "resources": {
    "main.tex": "\\documentclass[11pt]{article}\n\\usepackage[margin=0.85in]{geometry}\n\\pagestyle{empty}\n\\begin{document}\n\\noindent [[ .sender.name ]]\\\\\n[[ .sender.address ]]\\\\[0.25in]\n[[ .date ]]\\\\[0.25in]\n\\noindent [[ .recipient.name ]]\\\\\n[[ .recipient.address ]]\\\\[0.25in]\n\\noindent\\textbf{Re: [[ .subject ]]}\\\\[0.2in]\n[[ range .body ]]\\noindent [[ . ]]\\\\[0.14in]\n[[ end ]]\n[[ with .compensation ]]\\noindent\\textbf{Compensation:} [[ . ]]\\\\[0.18in][[ end ]]\n\\noindent Sincerely,\\\\[0.35in]\n[[ with .signer ]][[ . ]][[ else ]][[ .sender.name ]][[ end ]]\n\\end{document}"
  },
  "data": {
    "sender": {
      "name": "Orbit AI",
      "address": "44 Market St, SF"
    },
    "recipient": {
      "name": "Mina Chen",
      "address": "Austin, TX"
    },
    "date": "2026-07-07",
    "subject": "Offer for Senior Engineer",
    "body": [
      "We are pleased to offer you the role of Senior Engineer.",
      "Your anticipated start date is 2026-08-12."
    ],
    "signer": null,
    "compensation": "$185,000 base salary"
  }
};

const response = await fetch("https://api.texify.dev/render", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(payload),
  signal: AbortSignal.timeout(90_000),
});

if (!response.ok) throw new Error(await response.text());

const pdf = Buffer.from(await response.arrayBuffer());
await writeFile("offer-letter.pdf", pdf);

The template

LaTeX source sent as resources["main.tex"].

main.tex
\documentclass[11pt]{article}
\usepackage[margin=0.85in]{geometry}
\pagestyle{empty}
\begin{document}
\noindent [[ .sender.name ]]\\
[[ .sender.address ]]\\[0.25in]
[[ .date ]]\\[0.25in]
\noindent [[ .recipient.name ]]\\
[[ .recipient.address ]]\\[0.25in]
\noindent\textbf{Re: [[ .subject ]]}\\[0.2in]
[[ range .body ]]\noindent [[ . ]]\\[0.14in]
[[ end ]]
[[ with .compensation ]]\noindent\textbf{Compensation:} [[ . ]]\\[0.18in][[ end ]]
\noindent Sincerely,\\[0.35in]
[[ with .signer ]][[ . ]][[ else ]][[ .sender.name ]][[ end ]]
\end{document}

Live render

Try sample data now.

Posts this LaTeX template and sample JSON to /render, then opens the returned PDF bytes.

Sample data
{
  "sender": {
    "name": "Orbit AI",
    "address": "44 Market St, SF"
  },
  "recipient": {
    "name": "Mina Chen",
    "address": "Austin, TX"
  },
  "date": "2026-07-07",
  "subject": "Offer for Senior Engineer",
  "body": [
    "We are pleased to offer you the role of Senior Engineer.",
    "Your anticipated start date is 2026-08-12."
  ],
  "signer": null,
  "compensation": "$185,000 base salary"
}

FAQ

FAQ

Can I use Offer letter as a offer letter PDF API?

Yes. Copy the LaTeX template, send it in resources with your data to /render, and Texify returns PDF bytes.

Can I change colors, copy, or field names?

Yes. Edit the LaTeX source and JSON placeholders to match your data model and brand before posting to /render.

Does this render real PDF text?

Yes. Texify compiles LaTeX to PDF, so text remains selectable, searchable, and stable across environments.