Texify

Statements

Account statement PDF API

Customer account statement for credits, debits, invoices, and payments over a period. Useful for billing portals and finance ops tools. Send this LaTeX template and JSON data to Texify in one /render request.

Account statement PDF preview

JSON schema

Fields this template expects.

FieldTypeRequiredDescription
accountobjectYesAccount name, number, and address.
periodstringYesStatement period.
opening_balancenumberYesOpening balance.
transactionsarrayYesDated transaction rows.
closing_balancenumberYesClosing balance.

API examples

POST LaTeX and JSON. Receive PDF bytes.

curl
cat > account-statement-payload.json <<'JSON'
{
  "entrypoint": "main.tex",
  "resources": {
    "main.tex": "\\documentclass[11pt]{article}\n\\usepackage[margin=0.7in]{geometry}\n\\usepackage{array,booktabs}\n\\pagestyle{empty}\n\\begin{document}\n{\\Huge\\bfseries Account Statement}\\\\[4pt]\nPeriod: [[ .period ]]\\\\[0.2in]\n\\noindent\\textbf{Account}\\\\\n[[ .account.holder ]]\\\\\n[[ .account.number ]]\\\\[0.25in]\nOpening balance: [[ .opening_balance ]] [[ .currency ]]\\\\[0.18in]\n\\begin{tabular}{p{0.22\\textwidth}p{0.5\\textwidth}r}\n\\toprule\nDate & Description & Amount\\\\\n\\midrule\n[[ range .transactions ]][[ .date ]] & [[ .description ]] & [[ .amount ]]\\\\\n[[ end ]]\\bottomrule\n\\end{tabular}\n\\vspace{0.25in}\n\\begin{flushright}\n{\\Large\\bfseries Closing balance: [[ .closing_balance ]] [[ .currency ]]}\n\\end{flushright}\n\\end{document}"
  },
  "data": {
    "account": {
      "holder": "River Analytics",
      "number": "CUST-1049"
    },
    "period": "Q2 2026",
    "opening_balance": 1200,
    "transactions": [
      {
        "date": "2026-04-01",
        "description": "Invoice INV-104",
        "amount": 499
      },
      {
        "date": "2026-04-12",
        "description": "Payment",
        "amount": -499
      }
    ],
    "closing_balance": 1200,
    "currency": "USD"
  }
}
JSON

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

payload = json.loads(r'''{
  "entrypoint": "main.tex",
  "resources": {
    "main.tex": "\\documentclass[11pt]{article}\n\\usepackage[margin=0.7in]{geometry}\n\\usepackage{array,booktabs}\n\\pagestyle{empty}\n\\begin{document}\n{\\Huge\\bfseries Account Statement}\\\\[4pt]\nPeriod: [[ .period ]]\\\\[0.2in]\n\\noindent\\textbf{Account}\\\\\n[[ .account.holder ]]\\\\\n[[ .account.number ]]\\\\[0.25in]\nOpening balance: [[ .opening_balance ]] [[ .currency ]]\\\\[0.18in]\n\\begin{tabular}{p{0.22\\textwidth}p{0.5\\textwidth}r}\n\\toprule\nDate & Description & Amount\\\\\n\\midrule\n[[ range .transactions ]][[ .date ]] & [[ .description ]] & [[ .amount ]]\\\\\n[[ end ]]\\bottomrule\n\\end{tabular}\n\\vspace{0.25in}\n\\begin{flushright}\n{\\Large\\bfseries Closing balance: [[ .closing_balance ]] [[ .currency ]]}\n\\end{flushright}\n\\end{document}"
  },
  "data": {
    "account": {
      "holder": "River Analytics",
      "number": "CUST-1049"
    },
    "period": "Q2 2026",
    "opening_balance": 1200,
    "transactions": [
      {
        "date": "2026-04-01",
        "description": "Invoice INV-104",
        "amount": 499
      },
      {
        "date": "2026-04-12",
        "description": "Payment",
        "amount": -499
      }
    ],
    "closing_balance": 1200,
    "currency": "USD"
  }
}''')
response = requests.post(
    "https://api.texify.dev/render",
    json=payload,
    timeout=90,
)
response.raise_for_status()

with open("account-statement.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.7in]{geometry}\n\\usepackage{array,booktabs}\n\\pagestyle{empty}\n\\begin{document}\n{\\Huge\\bfseries Account Statement}\\\\[4pt]\nPeriod: [[ .period ]]\\\\[0.2in]\n\\noindent\\textbf{Account}\\\\\n[[ .account.holder ]]\\\\\n[[ .account.number ]]\\\\[0.25in]\nOpening balance: [[ .opening_balance ]] [[ .currency ]]\\\\[0.18in]\n\\begin{tabular}{p{0.22\\textwidth}p{0.5\\textwidth}r}\n\\toprule\nDate & Description & Amount\\\\\n\\midrule\n[[ range .transactions ]][[ .date ]] & [[ .description ]] & [[ .amount ]]\\\\\n[[ end ]]\\bottomrule\n\\end{tabular}\n\\vspace{0.25in}\n\\begin{flushright}\n{\\Large\\bfseries Closing balance: [[ .closing_balance ]] [[ .currency ]]}\n\\end{flushright}\n\\end{document}"
  },
  "data": {
    "account": {
      "holder": "River Analytics",
      "number": "CUST-1049"
    },
    "period": "Q2 2026",
    "opening_balance": 1200,
    "transactions": [
      {
        "date": "2026-04-01",
        "description": "Invoice INV-104",
        "amount": 499
      },
      {
        "date": "2026-04-12",
        "description": "Payment",
        "amount": -499
      }
    ],
    "closing_balance": 1200,
    "currency": "USD"
  }
};

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("account-statement.pdf", pdf);

The template

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

main.tex
\documentclass[11pt]{article}
\usepackage[margin=0.7in]{geometry}
\usepackage{array,booktabs}
\pagestyle{empty}
\begin{document}
{\Huge\bfseries Account Statement}\\[4pt]
Period: [[ .period ]]\\[0.2in]
\noindent\textbf{Account}\\
[[ .account.holder ]]\\
[[ .account.number ]]\\[0.25in]
Opening balance: [[ .opening_balance ]] [[ .currency ]]\\[0.18in]
\begin{tabular}{p{0.22\textwidth}p{0.5\textwidth}r}
\toprule
Date & Description & Amount\\
\midrule
[[ range .transactions ]][[ .date ]] & [[ .description ]] & [[ .amount ]]\\
[[ end ]]\bottomrule
\end{tabular}
\vspace{0.25in}
\begin{flushright}
{\Large\bfseries Closing balance: [[ .closing_balance ]] [[ .currency ]]}
\end{flushright}
\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
{
  "account": {
    "holder": "River Analytics",
    "number": "CUST-1049"
  },
  "period": "Q2 2026",
  "opening_balance": 1200,
  "transactions": [
    {
      "date": "2026-04-01",
      "description": "Invoice INV-104",
      "amount": 499
    },
    {
      "date": "2026-04-12",
      "description": "Payment",
      "amount": -499
    }
  ],
  "closing_balance": 1200,
  "currency": "USD"
}

FAQ

FAQ

Can I use Account statement as a account statement 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.