Texify

Resumes

Developer resume PDF API

Dedicated JSON to resume PDF template for software engineers, with projects, skills, links, and measurable impact bullets. Designed for LaTeX resume API searches and developer tooling workflows. Send this LaTeX template and JSON data to Texify in one /render request.

Developer resume PDF preview

LaTeX resume API for developer products and AI agents.

Developer resumes are dense: links, skills, projects, dates, and impact bullets must fit without looking cramped. LaTeX handles that typography better than browser print CSS and keeps output deterministic across deploys.

Send this LaTeX template plus JSON data to /render and get a classic LaTeX resume PDF back. Texify keeps text selectable for ATS parsing, preserves alignment, and avoids screenshot-style PDF generation.

This template fits career copilots, GitHub profile exporters, applicant tracking products, and any app that needs repeatable resume PDFs from structured data.

JSON schema

Fields this template expects.

FieldTypeRequiredDescription
namestringYesCandidate full name.
headlinestringYesShort professional summary.
contactobjectYesEmail, phone, location, website, and profiles.
experiencearrayYesRoles with company, dates, bullets, and impact metrics.
skillsarrayYesGrouped technical or professional skills.

API examples

POST LaTeX and JSON. Receive PDF bytes.

curl
cat > resume-developer-payload.json <<'JSON'
{
  "entrypoint": "main.tex",
  "resources": {
    "main.tex": "\\documentclass[10pt]{article}\n\\usepackage[margin=0.65in]{geometry}\n\\usepackage{array}\n\\pagestyle{empty}\n\\begin{document}\n\\begin{center}\n{\\LARGE\\bfseries [[ .name ]]}\\\\\n[[ .headline ]]\\\\[3pt]\n[[ .contact.email ]] \\quad [[ with .contact.phone ]][[ . ]] \\quad[[ end ]] [[ with .contact.location ]][[ . ]] \\quad[[ end ]] [[ with .contact.website ]][[ . ]][[ end ]]\n[[ with .contact.github ]]\\\\[[ . ]][[ end ]][[ with .contact.linkedin ]] \\quad [[ . ]][[ end ]]\n\\end{center}\n\\section*{Experience}\n[[ range .experience ]]\\noindent\\textbf{[[ .role ]]} --- [[ .company ]]\\hfill [[ .dates ]]\\\\\n\\begin{itemize}\n[[ range .bullets ]]\\item [[ . ]]\n[[ end ]]\\end{itemize}\n[[ end ]]\n[[ with .projects ]]\\section*{Projects}\n[[ range . ]]\\noindent\\textbf{[[ .name ]]} --- [[ .description ]]\\\\\n\\textit{[[ range .stack ]][[ . ]] [[ end ]]}\\\\[4pt]\n[[ end ]][[ end ]]\n\\section*{Skills}\n[[ range .skills ]]\\noindent\\textbf{[[ .group ]]}: [[ range .items ]][[ . ]] [[ end ]]\\\\\n[[ end ]]\\end{document}"
  },
  "data": {
    "name": "Riley Stone",
    "headline": "Full-stack engineer building AI workflow tools",
    "contact": {
      "email": "riley@example.com",
      "phone": "",
      "location": "",
      "website": "",
      "github": "github.com/rileystone",
      "linkedin": "linkedin.com/in/rileystone"
    },
    "experience": [
      {
        "company": "AgentWorks",
        "role": "Staff Engineer",
        "dates": "2022-2026",
        "bullets": [
          "Designed a render pipeline handling 2.4M PDFs/month",
          "Reduced cold starts by 37% with queued workers"
        ]
      }
    ],
    "projects": [
      {
        "name": "OpenInvoice",
        "description": "LaTeX invoice templates rendered from JSON",
        "stack": [
          "Next.js",
          "Rust",
          "Postgres"
        ]
      }
    ],
    "skills": [
      {
        "group": "Languages",
        "items": [
          "TypeScript",
          "Rust",
          "Python"
        ]
      },
      {
        "group": "Systems",
        "items": [
          "Queues",
          "Observability",
          "PDF generation"
        ]
      }
    ]
  }
}
JSON

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

payload = json.loads(r'''{
  "entrypoint": "main.tex",
  "resources": {
    "main.tex": "\\documentclass[10pt]{article}\n\\usepackage[margin=0.65in]{geometry}\n\\usepackage{array}\n\\pagestyle{empty}\n\\begin{document}\n\\begin{center}\n{\\LARGE\\bfseries [[ .name ]]}\\\\\n[[ .headline ]]\\\\[3pt]\n[[ .contact.email ]] \\quad [[ with .contact.phone ]][[ . ]] \\quad[[ end ]] [[ with .contact.location ]][[ . ]] \\quad[[ end ]] [[ with .contact.website ]][[ . ]][[ end ]]\n[[ with .contact.github ]]\\\\[[ . ]][[ end ]][[ with .contact.linkedin ]] \\quad [[ . ]][[ end ]]\n\\end{center}\n\\section*{Experience}\n[[ range .experience ]]\\noindent\\textbf{[[ .role ]]} --- [[ .company ]]\\hfill [[ .dates ]]\\\\\n\\begin{itemize}\n[[ range .bullets ]]\\item [[ . ]]\n[[ end ]]\\end{itemize}\n[[ end ]]\n[[ with .projects ]]\\section*{Projects}\n[[ range . ]]\\noindent\\textbf{[[ .name ]]} --- [[ .description ]]\\\\\n\\textit{[[ range .stack ]][[ . ]] [[ end ]]}\\\\[4pt]\n[[ end ]][[ end ]]\n\\section*{Skills}\n[[ range .skills ]]\\noindent\\textbf{[[ .group ]]}: [[ range .items ]][[ . ]] [[ end ]]\\\\\n[[ end ]]\\end{document}"
  },
  "data": {
    "name": "Riley Stone",
    "headline": "Full-stack engineer building AI workflow tools",
    "contact": {
      "email": "riley@example.com",
      "phone": "",
      "location": "",
      "website": "",
      "github": "github.com/rileystone",
      "linkedin": "linkedin.com/in/rileystone"
    },
    "experience": [
      {
        "company": "AgentWorks",
        "role": "Staff Engineer",
        "dates": "2022-2026",
        "bullets": [
          "Designed a render pipeline handling 2.4M PDFs/month",
          "Reduced cold starts by 37% with queued workers"
        ]
      }
    ],
    "projects": [
      {
        "name": "OpenInvoice",
        "description": "LaTeX invoice templates rendered from JSON",
        "stack": [
          "Next.js",
          "Rust",
          "Postgres"
        ]
      }
    ],
    "skills": [
      {
        "group": "Languages",
        "items": [
          "TypeScript",
          "Rust",
          "Python"
        ]
      },
      {
        "group": "Systems",
        "items": [
          "Queues",
          "Observability",
          "PDF generation"
        ]
      }
    ]
  }
}''')
response = requests.post(
    "https://api.texify.dev/render",
    json=payload,
    timeout=90,
)
response.raise_for_status()

with open("resume-developer.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[10pt]{article}\n\\usepackage[margin=0.65in]{geometry}\n\\usepackage{array}\n\\pagestyle{empty}\n\\begin{document}\n\\begin{center}\n{\\LARGE\\bfseries [[ .name ]]}\\\\\n[[ .headline ]]\\\\[3pt]\n[[ .contact.email ]] \\quad [[ with .contact.phone ]][[ . ]] \\quad[[ end ]] [[ with .contact.location ]][[ . ]] \\quad[[ end ]] [[ with .contact.website ]][[ . ]][[ end ]]\n[[ with .contact.github ]]\\\\[[ . ]][[ end ]][[ with .contact.linkedin ]] \\quad [[ . ]][[ end ]]\n\\end{center}\n\\section*{Experience}\n[[ range .experience ]]\\noindent\\textbf{[[ .role ]]} --- [[ .company ]]\\hfill [[ .dates ]]\\\\\n\\begin{itemize}\n[[ range .bullets ]]\\item [[ . ]]\n[[ end ]]\\end{itemize}\n[[ end ]]\n[[ with .projects ]]\\section*{Projects}\n[[ range . ]]\\noindent\\textbf{[[ .name ]]} --- [[ .description ]]\\\\\n\\textit{[[ range .stack ]][[ . ]] [[ end ]]}\\\\[4pt]\n[[ end ]][[ end ]]\n\\section*{Skills}\n[[ range .skills ]]\\noindent\\textbf{[[ .group ]]}: [[ range .items ]][[ . ]] [[ end ]]\\\\\n[[ end ]]\\end{document}"
  },
  "data": {
    "name": "Riley Stone",
    "headline": "Full-stack engineer building AI workflow tools",
    "contact": {
      "email": "riley@example.com",
      "phone": "",
      "location": "",
      "website": "",
      "github": "github.com/rileystone",
      "linkedin": "linkedin.com/in/rileystone"
    },
    "experience": [
      {
        "company": "AgentWorks",
        "role": "Staff Engineer",
        "dates": "2022-2026",
        "bullets": [
          "Designed a render pipeline handling 2.4M PDFs/month",
          "Reduced cold starts by 37% with queued workers"
        ]
      }
    ],
    "projects": [
      {
        "name": "OpenInvoice",
        "description": "LaTeX invoice templates rendered from JSON",
        "stack": [
          "Next.js",
          "Rust",
          "Postgres"
        ]
      }
    ],
    "skills": [
      {
        "group": "Languages",
        "items": [
          "TypeScript",
          "Rust",
          "Python"
        ]
      },
      {
        "group": "Systems",
        "items": [
          "Queues",
          "Observability",
          "PDF generation"
        ]
      }
    ]
  }
};

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("resume-developer.pdf", pdf);

The template

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

main.tex
\documentclass[10pt]{article}
\usepackage[margin=0.65in]{geometry}
\usepackage{array}
\pagestyle{empty}
\begin{document}
\begin{center}
{\LARGE\bfseries [[ .name ]]}\\
[[ .headline ]]\\[3pt]
[[ .contact.email ]] \quad [[ with .contact.phone ]][[ . ]] \quad[[ end ]] [[ with .contact.location ]][[ . ]] \quad[[ end ]] [[ with .contact.website ]][[ . ]][[ end ]]
[[ with .contact.github ]]\\[[ . ]][[ end ]][[ with .contact.linkedin ]] \quad [[ . ]][[ end ]]
\end{center}
\section*{Experience}
[[ range .experience ]]\noindent\textbf{[[ .role ]]} --- [[ .company ]]\hfill [[ .dates ]]\\
\begin{itemize}
[[ range .bullets ]]\item [[ . ]]
[[ end ]]\end{itemize}
[[ end ]]
[[ with .projects ]]\section*{Projects}
[[ range . ]]\noindent\textbf{[[ .name ]]} --- [[ .description ]]\\
\textit{[[ range .stack ]][[ . ]] [[ end ]]}\\[4pt]
[[ end ]][[ end ]]
\section*{Skills}
[[ range .skills ]]\noindent\textbf{[[ .group ]]}: [[ range .items ]][[ . ]] [[ end ]]\\
[[ 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
{
  "name": "Riley Stone",
  "headline": "Full-stack engineer building AI workflow tools",
  "contact": {
    "email": "riley@example.com",
    "phone": "",
    "location": "",
    "website": "",
    "github": "github.com/rileystone",
    "linkedin": "linkedin.com/in/rileystone"
  },
  "experience": [
    {
      "company": "AgentWorks",
      "role": "Staff Engineer",
      "dates": "2022-2026",
      "bullets": [
        "Designed a render pipeline handling 2.4M PDFs/month",
        "Reduced cold starts by 37% with queued workers"
      ]
    }
  ],
  "projects": [
    {
      "name": "OpenInvoice",
      "description": "LaTeX invoice templates rendered from JSON",
      "stack": [
        "Next.js",
        "Rust",
        "Postgres"
      ]
    }
  ],
  "skills": [
    {
      "group": "Languages",
      "items": [
        "TypeScript",
        "Rust",
        "Python"
      ]
    },
    {
      "group": "Systems",
      "items": [
        "Queues",
        "Observability",
        "PDF generation"
      ]
    }
  ]
}

FAQ

FAQ

Can I generate developer resumes from JSON?

Yes. Send this LaTeX resume source in resources with profile, experience, projects, and skills as JSON data to /render.

Is the PDF ATS-friendly?

The template produces normal selectable PDF text, clear headings, and a deterministic reading order rather than image-only output.

Why use LaTeX for resumes?

LaTeX gives crisp typography, stable spacing, and predictable one-page layout without headless browser drift.

Can an AI agent call this resume API?

Yes. The endpoint accepts structured JSON, making it practical for agents that draft, revise, and export resumes.