[{"data":1,"prerenderedAt":722},["ShallowReactive",2],{"guide-\u002Fdocs\u002Fguides\u002Fgetting-started\u002Fquickstart":3,"guides-all":659},{"id":4,"title":5,"body":6,"category":650,"description":651,"extension":652,"icon":653,"meta":654,"navigation":90,"order":69,"path":655,"seo":656,"stem":657,"__hash__":658},"guides\u002Fdocs\u002Fguides\u002Fgetting-started\u002Fquickstart.md","Quickstart — your first PDF in 5 minutes",{"type":7,"value":8,"toc":642},"minimark",[9,14,18,23,31,35,52,55,217,224,353,360,364,379,400,404,427,431,544,547,583,590,594,638],[10,11,13],"h1",{"id":12},"quickstart","Quickstart",[15,16,17],"p",{},"From signing up to your first generated PDF — five minutes, no theory.",[19,20,22],"h2",{"id":21},"_1-create-your-account","1. Create your account",[15,24,25,30],{},[26,27,29],"a",{"href":28},"\u002Fauth\u002Fregister","Sign up"," with an email and a password. You land on the dashboard with a Free plan (50 generation credits + 20 AI credits, renewed monthly).",[19,32,34],{"id":33},"_2-create-a-template","2. Create a template",[15,36,37,38,42,43,46,47,51],{},"From the ",[39,40,41],"strong",{},"Documents"," tab, click ",[39,44,45],{},"New document"," and pick a name (e.g. ",[48,49,50],"em",{},"Invoice","). You land in the editor with a default Hello-world template.",[15,53,54],{},"Replace the body with something concrete — the editor handles HTML, Tailwind classes, and Handlebars expressions:",[56,57,62],"pre",{"className":58,"code":59,"language":60,"meta":61,"style":61},"language-handlebars shiki shiki-themes github-light github-dark","\u003Csection class=\"p-12 font-sans\">\n  \u003Ch1 class=\"text-3xl font-bold\">Invoice {{invoice.number}}\u003C\u002Fh1>\n  \u003Cp class=\"mt-2 text-slate-600\">Billed to {{customer.name}}\u003C\u002Fp>\n\n  \u003Ctable class=\"mt-8 w-full border-collapse\">\n    \u003Cthead>\n      \u003Ctr class=\"border-b\">\n        \u003Cth class=\"text-left py-2\">Item\u003C\u002Fth>\n        \u003Cth class=\"text-right py-2\">Amount\u003C\u002Fth>\n      \u003C\u002Ftr>\n    \u003C\u002Fthead>\n    \u003Ctbody>\n      {{#each items}}\n        \u003Ctr class=\"border-b\">\n          \u003Ctd class=\"py-2\">{{label}}\u003C\u002Ftd>\n          \u003Ctd class=\"py-2 text-right\">{{amount}} €\u003C\u002Ftd>\n        \u003C\u002Ftr>\n      {{\u002Feach}}\n    \u003C\u002Ftbody>\n  \u003C\u002Ftable>\n\n  {{#if paid}}\n    \u003Cp class=\"mt-8 text-emerald-700 font-semibold\">PAID\u003C\u002Fp>\n  {{\u002Fif}}\n\u003C\u002Fsection>\n","handlebars","",[63,64,65,73,79,85,92,98,104,110,116,122,128,134,140,146,152,158,164,170,176,182,188,193,199,205,211],"code",{"__ignoreMap":61},[66,67,70],"span",{"class":68,"line":69},"line",1,[66,71,72],{},"\u003Csection class=\"p-12 font-sans\">\n",[66,74,76],{"class":68,"line":75},2,[66,77,78],{},"  \u003Ch1 class=\"text-3xl font-bold\">Invoice {{invoice.number}}\u003C\u002Fh1>\n",[66,80,82],{"class":68,"line":81},3,[66,83,84],{},"  \u003Cp class=\"mt-2 text-slate-600\">Billed to {{customer.name}}\u003C\u002Fp>\n",[66,86,88],{"class":68,"line":87},4,[66,89,91],{"emptyLinePlaceholder":90},true,"\n",[66,93,95],{"class":68,"line":94},5,[66,96,97],{},"  \u003Ctable class=\"mt-8 w-full border-collapse\">\n",[66,99,101],{"class":68,"line":100},6,[66,102,103],{},"    \u003Cthead>\n",[66,105,107],{"class":68,"line":106},7,[66,108,109],{},"      \u003Ctr class=\"border-b\">\n",[66,111,113],{"class":68,"line":112},8,[66,114,115],{},"        \u003Cth class=\"text-left py-2\">Item\u003C\u002Fth>\n",[66,117,119],{"class":68,"line":118},9,[66,120,121],{},"        \u003Cth class=\"text-right py-2\">Amount\u003C\u002Fth>\n",[66,123,125],{"class":68,"line":124},10,[66,126,127],{},"      \u003C\u002Ftr>\n",[66,129,131],{"class":68,"line":130},11,[66,132,133],{},"    \u003C\u002Fthead>\n",[66,135,137],{"class":68,"line":136},12,[66,138,139],{},"    \u003Ctbody>\n",[66,141,143],{"class":68,"line":142},13,[66,144,145],{},"      {{#each items}}\n",[66,147,149],{"class":68,"line":148},14,[66,150,151],{},"        \u003Ctr class=\"border-b\">\n",[66,153,155],{"class":68,"line":154},15,[66,156,157],{},"          \u003Ctd class=\"py-2\">{{label}}\u003C\u002Ftd>\n",[66,159,161],{"class":68,"line":160},16,[66,162,163],{},"          \u003Ctd class=\"py-2 text-right\">{{amount}} €\u003C\u002Ftd>\n",[66,165,167],{"class":68,"line":166},17,[66,168,169],{},"        \u003C\u002Ftr>\n",[66,171,173],{"class":68,"line":172},18,[66,174,175],{},"      {{\u002Feach}}\n",[66,177,179],{"class":68,"line":178},19,[66,180,181],{},"    \u003C\u002Ftbody>\n",[66,183,185],{"class":68,"line":184},20,[66,186,187],{},"  \u003C\u002Ftable>\n",[66,189,191],{"class":68,"line":190},21,[66,192,91],{"emptyLinePlaceholder":90},[66,194,196],{"class":68,"line":195},22,[66,197,198],{},"  {{#if paid}}\n",[66,200,202],{"class":68,"line":201},23,[66,203,204],{},"    \u003Cp class=\"mt-8 text-emerald-700 font-semibold\">PAID\u003C\u002Fp>\n",[66,206,208],{"class":68,"line":207},24,[66,209,210],{},"  {{\u002Fif}}\n",[66,212,214],{"class":68,"line":213},25,[66,215,216],{},"\u003C\u002Fsection>\n",[15,218,219,220,223],{},"Open the ",[39,221,222],{},"Variables"," panel on the right and seed it with sample data so the preview renders something meaningful:",[56,225,229],{"className":226,"code":227,"language":228,"meta":61,"style":61},"language-json shiki shiki-themes github-light github-dark","{\n  \"invoice\": { \"number\": \"INV-2026-0142\" },\n  \"customer\": { \"name\": \"Acme Corp\" },\n  \"items\": [\n    { \"label\": \"Pro subscription\", \"amount\": 1200 },\n    { \"label\": \"Top-up — 1k PDFs\", \"amount\": 80.50 }\n  ],\n  \"paid\": true\n}\n","json",[63,230,231,237,259,276,284,310,333,338,348],{"__ignoreMap":61},[66,232,233],{"class":68,"line":69},[66,234,236],{"class":235},"sVt8B","{\n",[66,238,239,243,246,249,252,256],{"class":68,"line":75},[66,240,242],{"class":241},"sj4cs","  \"invoice\"",[66,244,245],{"class":235},": { ",[66,247,248],{"class":241},"\"number\"",[66,250,251],{"class":235},": ",[66,253,255],{"class":254},"sZZnC","\"INV-2026-0142\"",[66,257,258],{"class":235}," },\n",[66,260,261,264,266,269,271,274],{"class":68,"line":81},[66,262,263],{"class":241},"  \"customer\"",[66,265,245],{"class":235},[66,267,268],{"class":241},"\"name\"",[66,270,251],{"class":235},[66,272,273],{"class":254},"\"Acme Corp\"",[66,275,258],{"class":235},[66,277,278,281],{"class":68,"line":87},[66,279,280],{"class":241},"  \"items\"",[66,282,283],{"class":235},": [\n",[66,285,286,289,292,294,297,300,303,305,308],{"class":68,"line":94},[66,287,288],{"class":235},"    { ",[66,290,291],{"class":241},"\"label\"",[66,293,251],{"class":235},[66,295,296],{"class":254},"\"Pro subscription\"",[66,298,299],{"class":235},", ",[66,301,302],{"class":241},"\"amount\"",[66,304,251],{"class":235},[66,306,307],{"class":241},"1200",[66,309,258],{"class":235},[66,311,312,314,316,318,321,323,325,327,330],{"class":68,"line":100},[66,313,288],{"class":235},[66,315,291],{"class":241},[66,317,251],{"class":235},[66,319,320],{"class":254},"\"Top-up — 1k PDFs\"",[66,322,299],{"class":235},[66,324,302],{"class":241},[66,326,251],{"class":235},[66,328,329],{"class":241},"80.50",[66,331,332],{"class":235}," }\n",[66,334,335],{"class":68,"line":106},[66,336,337],{"class":235},"  ],\n",[66,339,340,343,345],{"class":68,"line":112},[66,341,342],{"class":241},"  \"paid\"",[66,344,251],{"class":235},[66,346,347],{"class":241},"true\n",[66,349,350],{"class":68,"line":118},[66,351,352],{"class":235},"}\n",[15,354,355,356,359],{},"The right pane updates live. Click ",[39,357,358],{},"Save"," when happy.",[19,361,363],{"id":362},"_3-grab-the-document-uuid","3. Grab the document UUID",[15,365,366,367,370,371,374,375,378],{},"Still in the editor, copy the document's ",[39,368,369],{},"UUID"," from the integration panel (the long ",[63,372,373],{},"1d8e5d56-…"," value). You'll pass it as ",[63,376,377],{},"documentId"," on every API call.",[380,381,394],"aside",{"className":382},[383,384,385,386,387,388,389,390,391,392,393],"not-prose","my-6","rounded-md","border","border-blue-200","bg-blue-50","text-blue-900","px-4","py-3","text-[14px]","leading-relaxed",[15,395,396,399],{},[39,397,398],{},"Why a UUID, not the URL id?"," The numeric id is internal. The UUID is the public, unguessable handle — safe to embed in your code and your customers' source.",[19,401,403],{"id":402},"_4-create-an-api-key","4. Create an API key",[15,405,406,407,410,411,414,415,418,419,422,423,426],{},"Open ",[39,408,409],{},"API Keys → New key",", give it a name (e.g. ",[48,412,413],{},"Production"," or ",[48,416,417],{},"Dev — laptop","). Copy the ",[63,420,421],{},"tk_live_…"," token ",[39,424,425],{},"immediately"," — it's shown once and never again. Stash it in your secret manager.",[19,428,430],{"id":429},"_5-render-your-first-pdf","5. Render your first PDF",[56,432,436],{"className":433,"code":434,"language":435,"meta":61,"style":61},"language-bash shiki shiki-themes github-light github-dark","curl -X POST 'https:\u002F\u002Fapi.transactional.dev\u002Fv1\u002Fgenerate' \\\n  -H \"x-api-token: $TRANSACTIONAL_API_TOKEN\" \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\n    \"documentId\": \"1d8e5d56-1a4f-4b62-8c33-2d34a64b2f00\",\n    \"variables\": {\n      \"invoice\": { \"number\": \"INV-2026-0142\" },\n      \"customer\": { \"name\": \"Acme Corp\" },\n      \"items\": [\n        { \"label\": \"Pro subscription\", \"amount\": 1200 },\n        { \"label\": \"Top-up — 1k PDFs\", \"amount\": 80.50 }\n      ],\n      \"paid\": true\n    }\n  }'\n","bash",[63,437,438,456,472,481,489,494,499,504,509,514,519,524,529,534,539],{"__ignoreMap":61},[66,439,440,444,447,450,453],{"class":68,"line":69},[66,441,443],{"class":442},"sScJk","curl",[66,445,446],{"class":241}," -X",[66,448,449],{"class":254}," POST",[66,451,452],{"class":254}," 'https:\u002F\u002Fapi.transactional.dev\u002Fv1\u002Fgenerate'",[66,454,455],{"class":241}," \\\n",[66,457,458,461,464,467,470],{"class":68,"line":75},[66,459,460],{"class":241},"  -H",[66,462,463],{"class":254}," \"x-api-token: ",[66,465,466],{"class":235},"$TRANSACTIONAL_API_TOKEN",[66,468,469],{"class":254},"\"",[66,471,455],{"class":241},[66,473,474,476,479],{"class":68,"line":81},[66,475,460],{"class":241},[66,477,478],{"class":254}," 'Content-Type: application\u002Fjson'",[66,480,455],{"class":241},[66,482,483,486],{"class":68,"line":87},[66,484,485],{"class":241},"  -d",[66,487,488],{"class":254}," '{\n",[66,490,491],{"class":68,"line":94},[66,492,493],{"class":254},"    \"documentId\": \"1d8e5d56-1a4f-4b62-8c33-2d34a64b2f00\",\n",[66,495,496],{"class":68,"line":100},[66,497,498],{"class":254},"    \"variables\": {\n",[66,500,501],{"class":68,"line":106},[66,502,503],{"class":254},"      \"invoice\": { \"number\": \"INV-2026-0142\" },\n",[66,505,506],{"class":68,"line":112},[66,507,508],{"class":254},"      \"customer\": { \"name\": \"Acme Corp\" },\n",[66,510,511],{"class":68,"line":118},[66,512,513],{"class":254},"      \"items\": [\n",[66,515,516],{"class":68,"line":124},[66,517,518],{"class":254},"        { \"label\": \"Pro subscription\", \"amount\": 1200 },\n",[66,520,521],{"class":68,"line":130},[66,522,523],{"class":254},"        { \"label\": \"Top-up — 1k PDFs\", \"amount\": 80.50 }\n",[66,525,526],{"class":68,"line":136},[66,527,528],{"class":254},"      ],\n",[66,530,531],{"class":68,"line":142},[66,532,533],{"class":254},"      \"paid\": true\n",[66,535,536],{"class":68,"line":148},[66,537,538],{"class":254},"    }\n",[66,540,541],{"class":68,"line":154},[66,542,543],{"class":254},"  }'\n",[15,545,546],{},"Response:",[56,548,550],{"className":226,"code":549,"language":228,"meta":61,"style":61},"{\n  \"url\": \"https:\u002F\u002Ffiles.transactional.dev\u002Fclient\u002F42\u002Fgenerated\u002F...\u002F1716470000000.pdf\",\n  \"documentId\": \"1d8e5d56-1a4f-4b62-8c33-2d34a64b2f00\"\n}\n",[63,551,552,556,569,579],{"__ignoreMap":61},[66,553,554],{"class":68,"line":69},[66,555,236],{"class":235},[66,557,558,561,563,566],{"class":68,"line":75},[66,559,560],{"class":241},"  \"url\"",[66,562,251],{"class":235},[66,564,565],{"class":254},"\"https:\u002F\u002Ffiles.transactional.dev\u002Fclient\u002F42\u002Fgenerated\u002F...\u002F1716470000000.pdf\"",[66,567,568],{"class":235},",\n",[66,570,571,574,576],{"class":68,"line":81},[66,572,573],{"class":241},"  \"documentId\"",[66,575,251],{"class":235},[66,577,578],{"class":254},"\"1d8e5d56-1a4f-4b62-8c33-2d34a64b2f00\"\n",[66,580,581],{"class":68,"line":87},[66,582,352],{"class":235},[15,584,585,586,589],{},"That's your PDF. ",[63,587,588],{},"url"," is signed and short-lived — download it or stream it to your own bucket immediately.",[19,591,593],{"id":592},"where-to-go-next","Where to go next",[595,596,597,611,620,629],"ul",{},[598,599,600,606,607,610],"li",{},[39,601,602],{},[26,603,605],{"href":604},"\u002Fdocs\u002Fguides\u002Fai-mcp\u002Fuse-from-ai","Use Transactional from your AI assistant"," — let Claude or Cursor call ",[63,608,609],{},"generate_pdf"," for you.",[598,612,613,619],{},[39,614,615],{},[26,616,618],{"href":617},"\u002Fdocs\u002Fguides\u002Fintegrations\u002Fnode-bun","Calling \u002Fv1\u002Fgenerate from Node\u002FBun"," — production-grade integration with retries.",[598,621,622,628],{},[39,623,624],{},[26,625,627],{"href":626},"\u002Fdocs\u002Fguides\u002Fauthoring\u002Fmodeling-variables","Modeling your variables"," — what should be a variable vs. inline text.",[598,630,631,637],{},[39,632,633],{},[26,634,636],{"href":635},"\u002Fdocs\u002Fguides\u002Fauthoring\u002Fhandlebars","Handlebars cheat sheet"," — the exact subset supported.",[639,640,641],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":61,"searchDepth":75,"depth":75,"links":643},[644,645,646,647,648,649],{"id":21,"depth":75,"text":22},{"id":33,"depth":75,"text":34},{"id":362,"depth":75,"text":363},{"id":402,"depth":75,"text":403},{"id":429,"depth":75,"text":430},{"id":592,"depth":75,"text":593},"getting-started","Sign up, design a template, render your first PDF through the API. End-to-end in five minutes.","md","rocket",{},"\u002Fdocs\u002Fguides\u002Fgetting-started\u002Fquickstart",{"title":5,"description":651},"docs\u002Fguides\u002Fgetting-started\u002Fquickstart","DUAv0GQgko0MXPg96EBfb5DJgasL3mGIzOFe5TpbI1s",[660,665,669,673,677,681,685,687,692,694,696,700,701,705,709,713,718],{"path":661,"title":662,"description":663,"category":664,"order":94},"\u002Fdocs\u002Fguides\u002Fai-mcp\u002Fchatgpt","ChatGPT (via Custom GPT Actions)","ChatGPT doesn't speak MCP natively yet — but you can give it the same powers through a Custom GPT pointed at the Transactional REST API.","ai-mcp",{"path":666,"title":667,"description":668,"category":664,"order":81},"\u002Fdocs\u002Fguides\u002Fai-mcp\u002Fclaude-code","Claude Code (CLI)","Connect Transactional to Claude Code so it can read your templates and generate PDFs from your terminal.",{"path":670,"title":671,"description":672,"category":664,"order":75},"\u002Fdocs\u002Fguides\u002Fai-mcp\u002Fclaude-desktop","Claude Desktop","Connect Transactional to Claude Desktop on macOS or Windows so Claude can read your templates and generate PDFs.",{"path":674,"title":675,"description":676,"category":664,"order":87},"\u002Fdocs\u002Fguides\u002Fai-mcp\u002Fcursor","Cursor","Wire Transactional into Cursor's MCP support so you can generate PDFs from inside your editor.",{"path":678,"title":679,"description":680,"category":664,"order":100},"\u002Fdocs\u002Fguides\u002Fai-mcp\u002Fgemini","Gemini Code Assist \u002F Gemini CLI","Connect Transactional to Google's Gemini agents through their MCP support.",{"path":682,"title":683,"description":684,"category":664,"order":106},"\u002Fdocs\u002Fguides\u002Fai-mcp\u002Ftools-reference","MCP tools reference","Every tool the Transactional MCP server exposes, with arguments, return shapes, and a prompt that typically triggers each one.",{"path":604,"title":605,"description":686,"category":664,"order":69},"Connect Transactional to Claude, Cursor, ChatGPT, or Gemini via MCP so your assistant can read your templates and generate PDFs directly.",{"path":688,"title":689,"description":690,"category":691,"order":75},"\u002Fdocs\u002Fguides\u002Fauthoring\u002Fdesign-for-pdf","Designing templates that survive PDF rendering","PDFs are static — drop the animations, oversample your canvas charts, lean on vectors. The rules that make a template look sharp at print resolution.","authoring",{"path":635,"title":636,"description":693,"category":691,"order":69},"The exact subset of Handlebars supported in Transactional templates — variables, conditionals, loops, and what NOT to reach for.",{"path":626,"title":627,"description":695,"category":691,"order":81},"When to make something a variable vs. inline. Keep the API contract small, your templates portable, and your integration code boring.",{"path":697,"title":698,"description":699,"category":691,"order":87},"\u002Fdocs\u002Fguides\u002Fauthoring\u002Fworking-with-ai","Working with the AI assistant","Prompts and patterns to get good templates fast — what to ask, when to iterate, when to start over.",{"path":655,"title":5,"description":651,"category":650,"order":69},{"path":617,"title":702,"description":703,"category":704,"order":69},"Calling \u002Fv1\u002Fgenerate from Node.js & Bun","Production-grade integration using native fetch — retries, error handling, streaming the PDF to your storage.","integrations",{"path":706,"title":707,"description":708,"category":704,"order":75},"\u002Fdocs\u002Fguides\u002Fintegrations\u002Fphp-laravel","Calling \u002Fv1\u002Fgenerate from PHP & Laravel","cURL extension, Guzzle, or Laravel's HTTP client — render PDFs with retries and proper error handling.",{"path":710,"title":711,"description":712,"category":704,"order":81},"\u002Fdocs\u002Fguides\u002Fintegrations\u002Fpython","Calling \u002Fv1\u002Fgenerate from Python","urllib (stdlib), requests, or httpx with retry — render PDFs from Django, FastAPI, or any Python service.",{"path":714,"title":715,"description":716,"category":717,"order":69},"\u002Fdocs\u002Fguides\u002Foperations\u002Fmonitoring-usage","Monitoring usage & credits","Read the dashboard gauges, set sane alerts, and decide when to top up vs. upgrade.","operations",{"path":719,"title":720,"description":721,"category":717,"order":75},"\u002Fdocs\u002Fguides\u002Foperations\u002Fstoring-pdfs","Storing & serving the generated PDF","The \u002Fv1\u002Fgenerate URL is signed and short-lived. Patterns for keeping the PDF around — your bucket, your CDN, your DB.",1780347733842]