Texify

Statements

Bank statement PDF API

Account statement with opening balance, transaction table, and closing summary. Designed for fintech apps, ledgers, and customer portals. Send this LaTeX template and JSON data to Texify in one /render request.

Bank 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 > bank-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": "Acme GmbH",
      "number": "**** 2048"
    },
    "period": "2026-06",
    "opening_balance": 18420.11,
    "transactions": [
      {
        "date": "2026-06-04",
        "description": "API payout",
        "amount": 4200
      },
      {
        "date": "2026-06-12",
        "description": "Cloud hosting",
        "amount": -812.33
      }
    ],
    "closing_balance": 21807.78,
    "currency": "EUR"
  }
}
JSON

curl -sS -X POST https://api.texify.dev/render \
  -H "Content-Type: application/json" \
  --data @bank-statement-payload.json \
  --output bank-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": "Acme GmbH",
      "number": "**** 2048"
    },
    "period": "2026-06",
    "opening_balance": 18420.11,
    "transactions": [
      {
        "date": "2026-06-04",
        "description": "API payout",
        "amount": 4200
      },
      {
        "date": "2026-06-12",
        "description": "Cloud hosting",
        "amount": -812.33
      }
    ],
    "closing_balance": 21807.78,
    "currency": "EUR"
  }
}''')
response = requests.post(
    "https://api.texify.dev/render",
    json=payload,
    timeout=90,
)
response.raise_for_status()

with open("bank-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": "Acme GmbH",
      "number": "**** 2048"
    },
    "period": "2026-06",
    "opening_balance": 18420.11,
    "transactions": [
      {
        "date": "2026-06-04",
        "description": "API payout",
        "amount": 4200
      },
      {
        "date": "2026-06-12",
        "description": "Cloud hosting",
        "amount": -812.33
      }
    ],
    "closing_balance": 21807.78,
    "currency": "EUR"
  }
};

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("bank-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": "Acme GmbH",
    "number": "**** 2048"
  },
  "period": "2026-06",
  "opening_balance": 18420.11,
  "transactions": [
    {
      "date": "2026-06-04",
      "description": "API payout",
      "amount": 4200
    },
    {
      "date": "2026-06-12",
      "description": "Cloud hosting",
      "amount": -812.33
    }
  ],
  "closing_balance": 21807.78,
  "currency": "EUR"
}

FAQ

FAQ

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