[{"data":1,"prerenderedAt":2392},["ShallowReactive",2],{"pricing-plans":3,"content-page-\u002Fdocs\u002Frendering":4,"api-docs-metadata":1915,"i-ph:list":3,"i-ph:caret-right":3,"i-ph:copy":3,"i-ph:caret-down":3,"i-ph:twitter-logo":3,"i-ph:youtube-logo":3},null,{"id":5,"title":6,"body":7,"description":1906,"extension":1907,"meta":1908,"navigation":482,"path":1911,"seo":1912,"stem":1913,"__hash__":1914},"all\u002Fdocs\u002Frendering.md","Rendering API",{"type":8,"value":9,"toc":1891},"minimark",[10,14,36,41,49,58,68,108,113,409,424,429,601,604,611,627,637,642,938,992,1014,1022,1073,1078,1122,1127,1200,1205,1285,1290,1335,1340,1423,1430,1438,1445,1490,1505,1528,1537,1547,1603,1614,1621,1628,1635,1640,1753,1767,1771,1778,1790,1793,1874,1878,1888],[11,12,6],"h1",{"id":13},"rendering-api",[15,16,17,18,22,23,26,27,30,31,35],"p",{},"The Rendering API turns a Bannx ",[19,20,21],"strong",{},"page"," (from a template) into an image. Use a ",[19,24,25],{},"page ID"," with GET or POST: by default the page is loaded from the ",[19,28,29],{},"publish cache","; set ",[32,33,34],"code",{},"draft: true"," on POST to load from the database (unpublished).",[37,38,40],"h2",{"id":39},"endpoints","Endpoints",[42,43,45,46],"h3",{"id":44},"get-apirenderpageid","GET ",[32,47,48],{},"\u002Fapi\u002Frender\u002F:pageId",[15,50,51,52,30,54,57],{},"Render a page by ID using query parameters. By default loads from the ",[19,53,29],{},[32,55,56],{},"draft=true"," to load from the database (same as POST).",[15,59,60,63,64,67],{},[19,61,62],{},"Authentication"," depends on the template setting ",[19,65,66],{},"Require token for GET render"," (editor → Settings → Template):",[69,70,71,102],"ul",{},[72,73,74,77,78,81,82,85,86,89,90,93,94,97,98,101],"li",{},[19,75,76],{},"On (default):"," Send ",[32,79,80],{},"Authorization: Bearer \u003CAPI key>"," ",[19,83,84],{},"or"," add the space ",[19,87,88],{},"GET render URL secret"," as query param ",[32,91,92],{},"gt"," (create it under ",[19,95,96],{},"Settings → Space → Developers","). The API key must belong to the same space as the template. Useful for ",[32,99,100],{},"\u003Cimg src=\"...\">"," without request headers.",[72,103,104,107],{},[19,105,106],{},"Off:"," No auth; anyone with the page ID can call GET for that template’s pages.",[15,109,110],{},[19,111,112],{},"Query parameters:",[114,115,116,132],"table",{},[117,118,119],"thead",{},[120,121,122,126,129],"tr",{},[123,124,125],"th",{},"Parameter",[123,127,128],{},"Type",[123,130,131],{},"Description",[133,134,135,167,187,211,233,253,266,296,316,331,347,362,379,395],"tbody",{},[120,136,137,143,161],{},[138,139,140],"td",{},[32,141,142],{},"format",[138,144,145,148,149,148,152,148,155,148,158],{},[32,146,147],{},"png"," | ",[32,150,151],{},"svg",[32,153,154],{},"webp",[32,156,157],{},"pdf",[32,159,160],{},"pptx",[138,162,163,164,166],{},"Output format. Default: ",[32,165,147],{},".",[120,168,169,174,177],{},[138,170,171],{},[32,172,173],{},"draft",[138,175,176],{},"boolean",[138,178,179,180,183,184,166],{},"If ",[32,181,182],{},"true",", load from database instead of publish cache. Default: ",[32,185,186],{},"false",[120,188,189,194,202],{},[138,190,191],{},[32,192,193],{},"output",[138,195,196,148,199],{},[32,197,198],{},"json",[32,200,201],{},"binary",[138,203,204,205,207,208,210],{},"Response shape: omit or ",[32,206,198],{}," for metadata + file URL; ",[32,209,201],{}," for raw bytes.",[120,212,213,218,221],{},[138,214,215],{},[32,216,217],{},"scale",[138,219,220],{},"number (1–4)",[138,222,223,224,226,227,229,230,166],{},"Resolution multiplier for ",[32,225,147],{},"\u002F",[32,228,154],{}," (logical → physical pixels). Overrides the template’s render scale. Default: ",[32,231,232],{},"2",[120,234,235,240,243],{},[138,236,237],{},[32,238,239],{},"quality",[138,241,242],{},"number (1–100)",[138,244,245,246,249,250,166],{},"WebP encode quality (",[32,247,248],{},"format=webp"," only). Overrides the template’s setting. Default: ",[32,251,252],{},"90",[120,254,255,260,263],{},[138,256,257],{},[32,258,259],{},"templateId",[138,261,262],{},"string",[138,264,265],{},"Optional; validated against the page’s template.",[120,267,268,273,281],{},[138,269,270],{},[32,271,272],{},"renderType",[138,274,275,148,278],{},[32,276,277],{},"takumi",[32,279,280],{},"html",[138,282,283,284,286,287,289,290,293,294,166],{},"Override renderer. ",[32,285,277],{}," PDFs render with the Takumi engine (vector, selectable text); ",[32,288,280],{}," PDFs use headless Chrome. The legacy value ",[32,291,292],{},"satori"," is accepted and treated as ",[32,295,277],{},[120,297,298,303,305],{},[138,299,300],{},[32,301,302],{},"emojiType",[138,304,262],{},[138,306,307,308,311,312,315],{},"Override emoji set (e.g. ",[32,309,310],{},"twemoji",", ",[32,313,314],{},"openmoji",").",[120,317,318,323,325],{},[138,319,320],{},[32,321,322],{},"pageIds",[138,324,262],{},[138,326,327,328,315],{},"Comma-separated page IDs for merged PDF (",[32,329,330],{},"format=pdf",[120,332,333,338,341],{},[138,334,335],{},[32,336,337],{},"tweaksPerPage",[138,339,340],{},"string (JSON)",[138,342,343,344,346],{},"Per-page tweaks aligned with ",[32,345,322],{}," for PDF.",[120,348,349,354,356],{},[138,350,351],{},[32,352,353],{},"tweaks",[138,355,340],{},[138,357,358,359,166],{},"JSON object of variable overrides by name, e.g. ",[32,360,361],{},"{\"title\":\"Hello\",\"count\":5}",[120,363,364,369,371],{},[138,365,366],{},[32,367,368],{},"brandTweaks",[138,370,340],{},[138,372,373,374,315],{},"Brand token overrides by dot path (see ",[375,376,378],"a",{"href":377},"\u002Fdocs\u002Fbrands","Brands",[120,380,381,386,389],{},[138,382,383],{},[32,384,385],{},"tweak:\u003Cname>",[138,387,388],{},"string\u002Fnumber\u002Fboolean",[138,390,391,392,166],{},"Alternative: per-variable overrides, e.g. ",[32,393,394],{},"tweak:title=Hello",[120,396,397,401,403],{},[138,398,399],{},[32,400,92],{},[138,402,262],{},[138,404,405,406,166],{},"When auth is required: GET render secret (space-level), alternative to ",[32,407,408],{},"Authorization",[15,410,411,414,415,418,419,421,422,166],{},[19,412,413],{},"Response:"," Binary image\u002FPDF, or ",[32,416,417],{},"application\u002Fjson"," with file metadata when ",[32,420,193],{}," is not ",[32,423,201],{},[15,425,426],{},[19,427,428],{},"Example:",[430,431,436],"pre",{"className":432,"code":433,"language":434,"meta":435,"style":435},"language-bash shiki shiki-themes github-light github-dark","# PNG (default)\ncurl -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID\" -o out.png\n\n# WebP with variable overrides (JSON)\ncurl -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID?format=webp&tweaks=%7B%22title%22%3A%22Hello%22%7D\" -o out.webp\n\n# SVG with query tweaks\ncurl -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID?format=svg&tweak:title=Hello\" -o out.svg\n\n# Retina PNG at 4× scale\ncurl -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID?scale=4\" -o out@4x.png\n\n# Same request using GET URL secret (no Bearer)\ncurl \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID?format=png&gt=YOUR_GET_SECRET\" -o out.png\n","bash","",[32,437,438,447,465,477,484,490,501,512,517,523,534,545,550,556,567,578,583,589],{"__ignoreMap":435},[439,440,443],"span",{"class":441,"line":442},"line",1,[439,444,446],{"class":445},"sJ8bj","# PNG (default)\n",[439,448,450,454,458,462],{"class":441,"line":449},2,[439,451,453],{"class":452},"sScJk","curl",[439,455,457],{"class":456},"sj4cs"," -H",[439,459,461],{"class":460},"sZZnC"," \"Authorization: Bearer YOUR_TOKEN\"",[439,463,464],{"class":456}," \\\n",[439,466,468,471,474],{"class":441,"line":467},3,[439,469,470],{"class":460},"  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID\"",[439,472,473],{"class":456}," -o",[439,475,476],{"class":460}," out.png\n",[439,478,480],{"class":441,"line":479},4,[439,481,483],{"emptyLinePlaceholder":482},true,"\n",[439,485,487],{"class":441,"line":486},5,[439,488,489],{"class":445},"# WebP with variable overrides (JSON)\n",[439,491,493,495,497,499],{"class":441,"line":492},6,[439,494,453],{"class":452},[439,496,457],{"class":456},[439,498,461],{"class":460},[439,500,464],{"class":456},[439,502,504,507,509],{"class":441,"line":503},7,[439,505,506],{"class":460},"  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID?format=webp&tweaks=%7B%22title%22%3A%22Hello%22%7D\"",[439,508,473],{"class":456},[439,510,511],{"class":460}," out.webp\n",[439,513,515],{"class":441,"line":514},8,[439,516,483],{"emptyLinePlaceholder":482},[439,518,520],{"class":441,"line":519},9,[439,521,522],{"class":445},"# SVG with query tweaks\n",[439,524,526,528,530,532],{"class":441,"line":525},10,[439,527,453],{"class":452},[439,529,457],{"class":456},[439,531,461],{"class":460},[439,533,464],{"class":456},[439,535,537,540,542],{"class":441,"line":536},11,[439,538,539],{"class":460},"  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID?format=svg&tweak:title=Hello\"",[439,541,473],{"class":456},[439,543,544],{"class":460}," out.svg\n",[439,546,548],{"class":441,"line":547},12,[439,549,483],{"emptyLinePlaceholder":482},[439,551,553],{"class":441,"line":552},13,[439,554,555],{"class":445},"# Retina PNG at 4× scale\n",[439,557,559,561,563,565],{"class":441,"line":558},14,[439,560,453],{"class":452},[439,562,457],{"class":456},[439,564,461],{"class":460},[439,566,464],{"class":456},[439,568,570,573,575],{"class":441,"line":569},15,[439,571,572],{"class":460},"  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID?scale=4\"",[439,574,473],{"class":456},[439,576,577],{"class":460}," out@4x.png\n",[439,579,581],{"class":441,"line":580},16,[439,582,483],{"emptyLinePlaceholder":482},[439,584,586],{"class":441,"line":585},17,[439,587,588],{"class":445},"# Same request using GET URL secret (no Bearer)\n",[439,590,592,594,597,599],{"class":441,"line":591},18,[439,593,453],{"class":452},[439,595,596],{"class":460}," \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\u002FPAGE_ID?format=png&gt=YOUR_GET_SECRET\"",[439,598,473],{"class":456},[439,600,476],{"class":460},[602,603],"hr",{},[42,605,607,608],{"id":606},"post-apirender","POST ",[32,609,610],{},"\u002Fapi\u002Frender",[15,612,613,614,616,617,619,620,623,624,626],{},"Render using a ",[19,615,25],{},". Loads the page and template from the ",[19,618,29],{}," by default, or from the ",[19,621,622],{},"database"," when ",[32,625,34],{}," (e.g. before publish).",[15,628,629,632,633,636],{},[19,630,631],{},"Authentication:"," Required (",[32,634,635],{},"Authorization: Bearer \u003Ctoken>","). Rate limit: 60 requests\u002Fminute per token.",[15,638,639],{},[19,640,641],{},"Request body (JSON):",[114,643,644,655],{},[117,645,646],{},[120,647,648,651,653],{},[123,649,650],{},"Field",[123,652,128],{},[123,654,131],{},[133,656,657,690,703,720,731,746,782,801,812,829,851,868,881,897,921],{},[120,658,659,664,666],{},[138,660,661],{},[32,662,663],{},"pageId",[138,665,262],{},[138,667,668,671,672,311,674,311,676,678,679,226,681,683,684,686,687,689],{},[19,669,670],{},"Required"," for ",[32,673,147],{},[32,675,151],{},[32,677,154],{},". For ",[32,680,157],{},[32,682,160],{},", use ",[32,685,663],{}," (single page) or ",[32,688,322],{}," (merged document).",[120,691,692,696,700],{},[138,693,694],{},[32,695,322],{},[138,697,262,698],{},[439,699],{},[138,701,702],{},"Optional. Multiple pages for a merged PDF\u002FPPTX.",[120,704,705,709,714],{},[138,706,707],{},[32,708,337],{},[138,710,711,712],{},"object",[439,713],{},[138,715,716,717,719],{},"Optional. Per-page tweaks; length must match ",[32,718,322],{}," when provided.",[120,721,722,726,728],{},[138,723,724],{},[32,725,259],{},[138,727,262],{},[138,729,730],{},"Optional; when set, validated against the page’s template (can speed up parallel fetch).",[120,732,733,737,739],{},[138,734,735],{},[32,736,173],{},[138,738,176],{},[138,740,179,741,743,744,166],{},[32,742,182],{},", load page and template from the database instead of cache. Default: ",[32,745,186],{},[120,747,748,752,767],{},[138,749,750],{},[32,751,142],{},[138,753,754,148,756,148,758,148,760,148,762,148,764],{},[32,755,147],{},[32,757,151],{},[32,759,154],{},[32,761,157],{},[32,763,160],{},[32,765,766],{},"html5",[138,768,163,769,771,772,774,775,777,778,166],{},[32,770,147],{},". ",[32,773,157],{}," follows the template's renderer: Takumi templates render vector PDFs with selectable text (no browser), HTML templates use the Chrome pipeline. One credit per PDF page either way. ",[32,776,766],{}," returns a display-ad ZIP — see ",[375,779,781],{"href":780},"#html5-ads-format-html5","HTML5 ads",[120,783,784,789,792],{},[138,785,786],{},[32,787,788],{},"clickTag",[138,790,791],{},"string (URL)",[138,793,794,797,798,800],{},[32,795,796],{},"format=html5"," only. Landing page baked into the bundle's ",[32,799,788],{}," variable.",[120,802,803,807,809],{},[138,804,805],{},[32,806,353],{},[138,808,711],{},[138,810,811],{},"Variable overrides by name (applied to page, template, and global variables).",[120,813,814,818,820],{},[138,815,816],{},[32,817,368],{},[138,819,711],{},[138,821,822,823,826,827,315],{},"Brand token overrides by dot path, e.g. ",[32,824,825],{},"{\"colors.primary\":\"#7c3aed\"}"," — re-skins the render without editing the brand (see ",[375,828,378],{"href":377},[120,830,831,835,841],{},[138,832,833],{},[32,834,272],{},[138,836,837,148,839],{},[32,838,277],{},[32,840,280],{},[138,842,843,844,846,847,293,849,166],{},"Override the template’s renderer (applies to ",[32,845,157],{}," too). Legacy ",[32,848,292],{},[32,850,277],{},[120,852,853,857,859],{},[138,854,855],{},[32,856,217],{},[138,858,220],{},[138,860,223,861,226,863,865,866,166],{},[32,862,147],{},[32,864,154],{},". Default: ",[32,867,232],{},[120,869,870,874,876],{},[138,871,872],{},[32,873,239],{},[138,875,242],{},[138,877,878,879,166],{},"WebP encode quality. Default: ",[32,880,252],{},[120,882,883,887,889],{},[138,884,885],{},[32,886,302],{},[138,888,262],{},[138,890,891,892,311,894,896],{},"Optional; e.g. ",[32,893,310],{},[32,895,314],{},". Default from template\u002Fspace.",[120,898,899,903,905],{},[138,900,901],{},[32,902,193],{},[138,904,262],{},[138,906,907,908,910,911,311,913,916,917,920],{},"Optional. ",[32,909,198],{}," (default when omitted) returns metadata JSON; ",[32,912,201],{},[32,914,915],{},"image",", or ",[32,918,919],{},"raw"," returns the raw image body.",[120,922,923,927,929],{},[138,924,925],{},[32,926,201],{},[138,928,176],{},[138,930,931,932,934,935,166],{},"Optional. If ",[32,933,182],{},", same as ",[32,936,937],{},"output: \"binary\"",[15,939,940,81,943,945,946,311,948,311,950,311,952,311,954,311,956,311,959,311,962,311,965,311,967,311,970,973,974,977,978,311,981,311,984,987,988,991],{},[19,941,942],{},"Response (default):",[32,944,417],{}," with ",[32,947,663],{},[32,949,259],{},[32,951,173],{},[32,953,142],{},[32,955,272],{},[32,957,958],{},"mimeType",[32,960,961],{},"width",[32,963,964],{},"height",[32,966,302],{},[32,968,969],{},"renderMs",[32,971,972],{},"uploadMs",", and ",[32,975,976],{},"file"," (",[32,979,980],{},"id",[32,982,983],{},"url",[32,985,986],{},"sizeBytes","). The render is uploaded to temporary storage for your space; use ",[32,989,990],{},"file.url"," to display or download the image.",[15,993,994,1005,1006,623,1009,1011,1012,166],{},[19,995,996,997,1000,1001,1004],{},"Response (with ",[32,998,999],{},"\"output\": \"binary\""," or ",[32,1002,1003],{},"\"binary\": true"," in the body):"," Raw body — image types as GET, or ",[32,1007,1008],{},"application\u002Fpdf",[32,1010,142],{}," is ",[32,1013,157],{},[15,1015,1016],{},[19,1017,1018,1019,1021],{},"Example (JSON default — save response and inspect ",[32,1020,990],{},"):",[430,1023,1025],{"className":432,"code":1024,"language":434,"meta":435,"style":435},"curl -X POST -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"pageId\":\"PAGE_ID\",\"format\":\"webp\",\"tweaks\":{\"title\":\"Hello\"}}' \\\n  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\" -o response.json\n",[32,1026,1027,1043,1053,1063],{"__ignoreMap":435},[439,1028,1029,1031,1034,1037,1039,1041],{"class":441,"line":442},[439,1030,453],{"class":452},[439,1032,1033],{"class":456}," -X",[439,1035,1036],{"class":460}," POST",[439,1038,457],{"class":456},[439,1040,461],{"class":460},[439,1042,464],{"class":456},[439,1044,1045,1048,1051],{"class":441,"line":449},[439,1046,1047],{"class":456},"  -H",[439,1049,1050],{"class":460}," \"Content-Type: application\u002Fjson\"",[439,1052,464],{"class":456},[439,1054,1055,1058,1061],{"class":441,"line":467},[439,1056,1057],{"class":456},"  -d",[439,1059,1060],{"class":460}," '{\"pageId\":\"PAGE_ID\",\"format\":\"webp\",\"tweaks\":{\"title\":\"Hello\"}}'",[439,1062,464],{"class":456},[439,1064,1065,1068,1070],{"class":441,"line":479},[439,1066,1067],{"class":460},"  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\"",[439,1069,473],{"class":456},[439,1071,1072],{"class":460}," response.json\n",[15,1074,1075],{},[19,1076,1077],{},"Example (raw image body):",[430,1079,1081],{"className":432,"code":1080,"language":434,"meta":435,"style":435},"curl -X POST -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"pageId\":\"PAGE_ID\",\"format\":\"webp\",\"output\":\"binary\",\"tweaks\":{\"title\":\"Hello\"}}' \\\n  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\" -o out.webp\n",[32,1082,1083,1097,1105,1114],{"__ignoreMap":435},[439,1084,1085,1087,1089,1091,1093,1095],{"class":441,"line":442},[439,1086,453],{"class":452},[439,1088,1033],{"class":456},[439,1090,1036],{"class":460},[439,1092,457],{"class":456},[439,1094,461],{"class":460},[439,1096,464],{"class":456},[439,1098,1099,1101,1103],{"class":441,"line":449},[439,1100,1047],{"class":456},[439,1102,1050],{"class":460},[439,1104,464],{"class":456},[439,1106,1107,1109,1112],{"class":441,"line":467},[439,1108,1057],{"class":456},[439,1110,1111],{"class":460}," '{\"pageId\":\"PAGE_ID\",\"format\":\"webp\",\"output\":\"binary\",\"tweaks\":{\"title\":\"Hello\"}}'",[439,1113,464],{"class":456},[439,1115,1116,1118,1120],{"class":441,"line":479},[439,1117,1067],{"class":460},[439,1119,473],{"class":456},[439,1121,511],{"class":460},[15,1123,1124],{},[19,1125,1126],{},"Example (draft \u002F unpublished page):",[430,1128,1131],{"className":1129,"code":1130,"language":198,"meta":435,"style":435},"language-json shiki shiki-themes github-light github-dark","{\n  \"pageId\": \"PAGE_ID\",\n  \"draft\": true,\n  \"format\": \"png\",\n  \"tweaks\": { \"title\": \"My Banner\" }\n}\n",[32,1132,1133,1139,1153,1164,1176,1195],{"__ignoreMap":435},[439,1134,1135],{"class":441,"line":442},[439,1136,1138],{"class":1137},"sVt8B","{\n",[439,1140,1141,1144,1147,1150],{"class":441,"line":449},[439,1142,1143],{"class":456},"  \"pageId\"",[439,1145,1146],{"class":1137},": ",[439,1148,1149],{"class":460},"\"PAGE_ID\"",[439,1151,1152],{"class":1137},",\n",[439,1154,1155,1158,1160,1162],{"class":441,"line":467},[439,1156,1157],{"class":456},"  \"draft\"",[439,1159,1146],{"class":1137},[439,1161,182],{"class":456},[439,1163,1152],{"class":1137},[439,1165,1166,1169,1171,1174],{"class":441,"line":479},[439,1167,1168],{"class":456},"  \"format\"",[439,1170,1146],{"class":1137},[439,1172,1173],{"class":460},"\"png\"",[439,1175,1152],{"class":1137},[439,1177,1178,1181,1184,1187,1189,1192],{"class":441,"line":486},[439,1179,1180],{"class":456},"  \"tweaks\"",[439,1182,1183],{"class":1137},": { ",[439,1185,1186],{"class":456},"\"title\"",[439,1188,1146],{"class":1137},[439,1190,1191],{"class":460},"\"My Banner\"",[439,1193,1194],{"class":1137}," }\n",[439,1196,1197],{"class":441,"line":492},[439,1198,1199],{"class":1137},"}\n",[15,1201,1202],{},[19,1203,1204],{},"Example (brand overrides — same design, different brand):",[430,1206,1208],{"className":1129,"code":1207,"language":198,"meta":435,"style":435},"{\n  \"pageId\": \"PAGE_ID\",\n  \"format\": \"png\",\n  \"brandTweaks\": {\n    \"colors.primary\": \"#7c3aed\",\n    \"colors.secondary\": \"#0f0a1e\",\n    \"logos.logo\": \"https:\u002F\u002Fcdn.example.com\u002Facme-logo.svg\"\n  }\n}\n",[32,1209,1210,1214,1224,1234,1242,1254,1266,1276,1281],{"__ignoreMap":435},[439,1211,1212],{"class":441,"line":442},[439,1213,1138],{"class":1137},[439,1215,1216,1218,1220,1222],{"class":441,"line":449},[439,1217,1143],{"class":456},[439,1219,1146],{"class":1137},[439,1221,1149],{"class":460},[439,1223,1152],{"class":1137},[439,1225,1226,1228,1230,1232],{"class":441,"line":467},[439,1227,1168],{"class":456},[439,1229,1146],{"class":1137},[439,1231,1173],{"class":460},[439,1233,1152],{"class":1137},[439,1235,1236,1239],{"class":441,"line":479},[439,1237,1238],{"class":456},"  \"brandTweaks\"",[439,1240,1241],{"class":1137},": {\n",[439,1243,1244,1247,1249,1252],{"class":441,"line":486},[439,1245,1246],{"class":456},"    \"colors.primary\"",[439,1248,1146],{"class":1137},[439,1250,1251],{"class":460},"\"#7c3aed\"",[439,1253,1152],{"class":1137},[439,1255,1256,1259,1261,1264],{"class":441,"line":492},[439,1257,1258],{"class":456},"    \"colors.secondary\"",[439,1260,1146],{"class":1137},[439,1262,1263],{"class":460},"\"#0f0a1e\"",[439,1265,1152],{"class":1137},[439,1267,1268,1271,1273],{"class":441,"line":503},[439,1269,1270],{"class":456},"    \"logos.logo\"",[439,1272,1146],{"class":1137},[439,1274,1275],{"class":460},"\"https:\u002F\u002Fcdn.example.com\u002Facme-logo.svg\"\n",[439,1277,1278],{"class":441,"line":514},[439,1279,1280],{"class":1137},"  }\n",[439,1282,1283],{"class":441,"line":519},[439,1284,1199],{"class":1137},[15,1286,1287],{},[19,1288,1289],{},"Example (single-page PDF):",[430,1291,1293],{"className":432,"code":1292,"language":434,"meta":435,"style":435},"curl -X POST -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"pageId\":\"PAGE_ID\",\"format\":\"pdf\",\"output\":\"binary\"}' \\\n  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\" -o out.pdf\n",[32,1294,1295,1309,1317,1326],{"__ignoreMap":435},[439,1296,1297,1299,1301,1303,1305,1307],{"class":441,"line":442},[439,1298,453],{"class":452},[439,1300,1033],{"class":456},[439,1302,1036],{"class":460},[439,1304,457],{"class":456},[439,1306,461],{"class":460},[439,1308,464],{"class":456},[439,1310,1311,1313,1315],{"class":441,"line":449},[439,1312,1047],{"class":456},[439,1314,1050],{"class":460},[439,1316,464],{"class":456},[439,1318,1319,1321,1324],{"class":441,"line":467},[439,1320,1057],{"class":456},[439,1322,1323],{"class":460}," '{\"pageId\":\"PAGE_ID\",\"format\":\"pdf\",\"output\":\"binary\"}'",[439,1325,464],{"class":456},[439,1327,1328,1330,1332],{"class":441,"line":479},[439,1329,1067],{"class":460},[439,1331,473],{"class":456},[439,1333,1334],{"class":460}," out.pdf\n",[15,1336,1337],{},[19,1338,1339],{},"Example (merged multi-page PDF):",[430,1341,1343],{"className":1129,"code":1342,"language":198,"meta":435,"style":435},"{\n  \"pageIds\": [\"PAGE_A\", \"PAGE_B\"],\n  \"format\": \"pdf\",\n  \"output\": \"binary\",\n  \"tweaksPerPage\": [{ \"title\": \"Page A\" }, { \"title\": \"Page B\" }]\n}\n",[32,1344,1345,1349,1368,1379,1391,1419],{"__ignoreMap":435},[439,1346,1347],{"class":441,"line":442},[439,1348,1138],{"class":1137},[439,1350,1351,1354,1357,1360,1362,1365],{"class":441,"line":449},[439,1352,1353],{"class":456},"  \"pageIds\"",[439,1355,1356],{"class":1137},": [",[439,1358,1359],{"class":460},"\"PAGE_A\"",[439,1361,311],{"class":1137},[439,1363,1364],{"class":460},"\"PAGE_B\"",[439,1366,1367],{"class":1137},"],\n",[439,1369,1370,1372,1374,1377],{"class":441,"line":467},[439,1371,1168],{"class":456},[439,1373,1146],{"class":1137},[439,1375,1376],{"class":460},"\"pdf\"",[439,1378,1152],{"class":1137},[439,1380,1381,1384,1386,1389],{"class":441,"line":479},[439,1382,1383],{"class":456},"  \"output\"",[439,1385,1146],{"class":1137},[439,1387,1388],{"class":460},"\"binary\"",[439,1390,1152],{"class":1137},[439,1392,1393,1396,1399,1401,1403,1406,1409,1411,1413,1416],{"class":441,"line":486},[439,1394,1395],{"class":456},"  \"tweaksPerPage\"",[439,1397,1398],{"class":1137},": [{ ",[439,1400,1186],{"class":456},[439,1402,1146],{"class":1137},[439,1404,1405],{"class":460},"\"Page A\"",[439,1407,1408],{"class":1137}," }, { ",[439,1410,1186],{"class":456},[439,1412,1146],{"class":1137},[439,1414,1415],{"class":460},"\"Page B\"",[439,1417,1418],{"class":1137}," }]\n",[439,1420,1421],{"class":441,"line":492},[439,1422,1199],{"class":1137},[15,1424,1425,1426,166],{},"For long, content-driven PDFs where the number of pages depends on the data (invoices, catalogs, reports), see ",[375,1427,1429],{"href":1428},"\u002Fdocs\u002Fpagination","Auto-pagination",[37,1431,1433,1434,1437],{"id":1432},"html5-ads-format-html5","HTML5 ads (",[32,1435,1436],{},"format: \"html5\"",")",[15,1439,1440,1441,1444],{},"Export a page as a ",[19,1442,1443],{},"self-contained HTML5 display-ad bundle"," — the ZIP that Google Ads, Display & Video 360 and most other ad platforms accept as an uploaded creative.",[430,1446,1448],{"className":432,"code":1447,"language":434,"meta":435,"style":435},"curl -X POST -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"pageId\":\"PAGE_ID\",\"format\":\"html5\",\"output\":\"binary\",\"clickTag\":\"https:\u002F\u002Fexample.com\u002Foffer\"}' \\\n  \"https:\u002F\u002Fyour-app.bannx.app\u002Fapi\u002Frender\" -o ad.zip\n",[32,1449,1450,1464,1472,1481],{"__ignoreMap":435},[439,1451,1452,1454,1456,1458,1460,1462],{"class":441,"line":442},[439,1453,453],{"class":452},[439,1455,1033],{"class":456},[439,1457,1036],{"class":460},[439,1459,457],{"class":456},[439,1461,461],{"class":460},[439,1463,464],{"class":456},[439,1465,1466,1468,1470],{"class":441,"line":449},[439,1467,1047],{"class":456},[439,1469,1050],{"class":460},[439,1471,464],{"class":456},[439,1473,1474,1476,1479],{"class":441,"line":467},[439,1475,1057],{"class":456},[439,1477,1478],{"class":460}," '{\"pageId\":\"PAGE_ID\",\"format\":\"html5\",\"output\":\"binary\",\"clickTag\":\"https:\u002F\u002Fexample.com\u002Foffer\"}'",[439,1480,464],{"class":456},[439,1482,1483,1485,1487],{"class":441,"line":479},[439,1484,1067],{"class":460},[439,1486,473],{"class":456},[439,1488,1489],{"class":460}," ad.zip\n",[15,1491,1492,1493,1496,1497,1500,1501,1504],{},"The bundle contains ",[32,1494,1495],{},"index.html"," at its root, a ",[32,1498,1499],{},"styles.css",", and an ",[32,1502,1503],{},"assets\u002F"," folder holding every image and font the ad uses. It is built to the rules ad platforms validate against:",[69,1506,1507,1515,1522],{},[72,1508,1509,1514],{},[19,1510,1511],{},[32,1512,1513],{},"\u003Cmeta name=\"ad.size\">"," declares the creative's pixel size, taken from the page.",[72,1516,1517,1521],{},[19,1518,1519],{},[32,1520,788],{}," is a global variable and the click is routed through it. Platforms overwrite it at serve time to attach click tracking, so the value you pass is the local-preview default rather than the final destination.",[72,1523,1524,1527],{},[19,1525,1526],{},"Nothing loads from the network."," Images and webfonts are fetched at export time and rewritten to relative paths, because an ad that requests an external URL at serve time is rejected.",[15,1529,1530,1531,1533,1534,1536],{},"One ad bundle is one creative size, so ",[32,1532,766],{}," takes a single ",[32,1535,663],{},". For a campaign covering several sizes, keep one page per size and export each — that is how platforms expect them uploaded.",[15,1538,1539,1542,1543,1546],{},[19,1540,1541],{},"Size matters:"," Google Ads rejects bundles over ",[19,1544,1545],{},"150 KB"," (max 40 files). The export keeps its own weight down — it subsets webfonts to the weights the page actually uses and stores inline images as files rather than base64 — but a heavy photo will still blow the budget. The response reports where you stand:",[69,1548,1549,1580],{},[72,1550,1551,1552,1554,1555,977,1558,226,1561,1564,1565,973,1568,1571,1572,1575,1576,1579],{},"With ",[32,1553,937],{},", the verdict rides on headers: ",[32,1556,1557],{},"X-Ad-Compliant",[32,1559,1560],{},"1",[32,1562,1563],{},"0","), ",[32,1566,1567],{},"X-Ad-Size",[32,1569,1570],{},"X-Ad-Errors"," \u002F ",[32,1573,1574],{},"X-Ad-Warnings"," (URL-encoded, ",[32,1577,1578],{},"|","-separated).",[72,1581,1582,1583,1586,1587,311,1590,311,1593,311,1596,1599,1600,166],{},"Otherwise the JSON response carries an ",[32,1584,1585],{},"ad"," object with ",[32,1588,1589],{},"compliant",[32,1591,1592],{},"errors",[32,1594,1595],{},"warnings",[32,1597,1598],{},"totalBytes"," and ",[32,1601,1602],{},"fileCount",[15,1604,1605,1606,1609,1610,1613],{},"An ",[19,1607,1608],{},"error"," means a platform will reject the bundle (typically an asset that could not be fetched, so the ad still points at a URL). A ",[19,1611,1612],{},"warning"," is yours to judge — over 150 KB, or an asset too large to bundle.",[15,1615,1616,1617,1620],{},"In the editor, choose ",[19,1618,1619],{},"HTML5 ad (ZIP)"," in the Automate panel's format selector, set the landing page, and download.",[37,1622,1624,1625,1437],{"id":1623},"code-to-image-post-apicode-to-image","Code-to-image (POST ",[32,1626,1627],{},"\u002Fapi\u002Fcode-to-image",[15,1629,1630,1631,1634],{},"Separate endpoint to render ",[19,1632,1633],{},"code snippets"," as images (syntax highlighting). No API token required for this endpoint.",[15,1636,1637],{},[19,1638,1639],{},"Request body:",[114,1641,1642,1652],{},[117,1643,1644],{},[120,1645,1646,1648,1650],{},[123,1647,650],{},[123,1649,128],{},[123,1651,131],{},[133,1653,1654,1665,1686,1701,1721,1740],{},[120,1655,1656,1660,1662],{},[138,1657,1658],{},[32,1659,32],{},[138,1661,262],{},[138,1663,1664],{},"Required. Source code to render.",[120,1666,1667,1672,1674],{},[138,1668,1669],{},[32,1670,1671],{},"lang",[138,1673,262],{},[138,1675,1676,1677,311,1680,1683,1684,166],{},"Language for highlighting (e.g. ",[32,1678,1679],{},"js",[32,1681,1682],{},"ts","). Default: ",[32,1685,1679],{},[120,1687,1688,1693,1695],{},[138,1689,1690],{},[32,1691,1692],{},"theme",[138,1694,262],{},[138,1696,1697,1698,166],{},"Shiki theme. Default: ",[32,1699,1700],{},"github-dark",[120,1702,1703,1707,1716],{},[138,1704,1705],{},[32,1706,142],{},[138,1708,1709,148,1711,148,1713],{},[32,1710,147],{},[32,1712,154],{},[32,1714,1715],{},"jpeg",[138,1717,1718,1719,166],{},"Default: ",[32,1720,154],{},[120,1722,1723,1734,1737],{},[138,1724,1725,311,1727,311,1729,311,1731],{},[32,1726,961],{},[32,1728,964],{},[32,1730,239],{},[32,1732,1733],{},"style",[138,1735,1736],{},"optional",[138,1738,1739],{},"Layout and style options.",[120,1741,1742,1747,1749],{},[138,1743,1744],{},[32,1745,1746],{},"showLineNumbers",[138,1748,176],{},[138,1750,1718,1751,166],{},[32,1752,186],{},[15,1754,1755,81,1757,945,1759,1762,1763,973,1765,166],{},[19,1756,413],{},[32,1758,417],{},[32,1760,1761],{},"dataUrl"," (the rendered image as a data URL), ",[32,1764,142],{},[32,1766,958],{},[37,1768,1770],{"id":1769},"render-logs","Render logs",[15,1772,1773,1774,1777],{},"Every render is logged for your space. In the editor, open the ",[19,1775,1776],{},"Render Logs"," panel to inspect recent requests (status, timings, format, and the requesting token).",[15,1779,1780,1785,1786,1789],{},[1781,1782],"img",{"alt":1783,"src":1784},"The editor's Render Logs panel: recent \u002Fapi\u002Frender requests with status and format, and the selected render's output preview","\u002Fimages\u002Fdocs\u002Feditor\u002Frender-logs-panel.png"," Programmatically, a logged-in dashboard session can list logs via ",[32,1787,1788],{},"GET \u002Fapi\u002Frenders\u002Flogs?templateId=…&page=…&perPage=…"," — useful for debugging integrations. This endpoint uses session authentication (it is not callable with an API key).",[37,1791,1792],{"id":1592},"Errors",[114,1794,1795,1805],{},[117,1796,1797],{},[120,1798,1799,1802],{},[123,1800,1801],{},"Status",[123,1803,1804],{},"Meaning",[133,1806,1807,1825,1842,1852,1864],{},[120,1808,1809,1814],{},[138,1810,1811],{},[32,1812,1813],{},"400 Bad Request",[138,1815,1816,1817,1820,1821,1000,1823,315],{},"Malformed request (e.g. ",[32,1818,1819],{},"token=…"," in query — use ",[32,1822,92],{},[32,1824,408],{},[120,1826,1827,1832],{},[138,1828,1829],{},[32,1830,1831],{},"422 Validation Error",[138,1833,1834,1835,1837,1838,1841],{},"Body or query failed validation (e.g. missing ",[32,1836,663],{},"). The response includes ",[32,1839,1840],{},"data.fieldErrors"," with per-field messages.",[120,1843,1844,1849],{},[138,1845,1846],{},[32,1847,1848],{},"401 Unauthorized",[138,1850,1851],{},"Missing or invalid auth when the template requires GET token.",[120,1853,1854,1859],{},[138,1855,1856],{},[32,1857,1858],{},"404 Not Found",[138,1860,1861,1862,315],{},"Page or template not found (or not in cache when not using ",[32,1863,173],{},[120,1865,1866,1871],{},[138,1867,1868],{},[32,1869,1870],{},"500 Internal Server Error",[138,1872,1873],{},"Rendering failed.",[37,1875,1877],{"id":1876},"webhooks","Webhooks",[15,1879,1880,1881,1883,1884,1887],{},"Render requests can trigger ",[19,1882,1876],{}," (e.g. upload result, update log). See ",[375,1885,1877],{"href":1886},"\u002Fdocs\u002Fwebhooks"," for configuration and behavior.",[1733,1889,1890],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .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}",{"title":435,"searchDepth":449,"depth":449,"links":1892},[1893,1899,1901,1903,1904,1905],{"id":39,"depth":449,"text":40,"children":1894},[1895,1897],{"id":44,"depth":467,"text":1896},"GET \u002Fapi\u002Frender\u002F:pageId",{"id":606,"depth":467,"text":1898},"POST \u002Fapi\u002Frender",{"id":1432,"depth":449,"text":1900},"HTML5 ads (format: \"html5\")",{"id":1623,"depth":449,"text":1902},"Code-to-image (POST \u002Fapi\u002Fcode-to-image)",{"id":1769,"depth":449,"text":1770},{"id":1592,"depth":449,"text":1792},{"id":1876,"depth":449,"text":1877},"Render a page to PNG, SVG, WebP, PDF, or PPTX via GET or POST using page ID (cache or draft).","md",{"layout":1909,"updatedAt":1910},"docs","2026-07-06","\u002Fdocs\u002Frendering",{"title":6,"description":1906},"docs\u002Frendering","CuS5teIPEqjdEXrcXXsJATIO97zfUUy9bFJIA81gRWI",{"success":482,"routes":1916,"total":2390,"generatedAt":2391,"canViewAllApiDocs":1980},[1917,1957,1968,2012,2064,2083,2104,2118,2133,2145,2157,2174,2202,2228,2247,2259,2270,2281,2290,2296,2314,2325,2340,2352,2365],{"path":1627,"method":1918,"summary":1919,"description":1920,"tags":1921,"group":1922,"requestBody":1923,"responses":1949,"actionName":1956},"POST","Render code snippets as images","Render source code with syntax highlighting to PNG, WebP, or JPEG. No API token required.",[1922],"Rendering",{"content":1924},{"application\u002Fjson":1925},{"schema":1926},{"type":711,"required":1927,"properties":1928},[32],{"code":1929,"lang":1931,"theme":1933,"format":1935,"width":1938,"height":1941,"quality":1943,"showLineNumbers":1945,"style":1947},{"type":262,"description":1930},"Source code to render",{"type":262,"description":1932},"Language for highlighting (e.g. js, ts). Default: js",{"type":262,"description":1934},"Shiki theme. Default: github-dark",{"type":262,"enum":1936,"description":1937},[147,154,1715],"Output format. Default: png (lossless)",{"type":1939,"description":1940},"number","Optional width",{"type":1939,"description":1942},"Optional height",{"type":1939,"description":1944},"Optional quality",{"type":176,"description":1946},"Show 1-based line numbers in a left gutter. Default: false",{"type":711,"description":1948},"Optional style options",{"200":1950,"400":1952,"500":1954},{"description":1951},"Image (data URL or binary depending on format)",{"description":1953},"Missing or invalid code",{"description":1955},"Failed to generate code image","codeToImage",{"path":1958,"method":1918,"summary":1959,"description":1960,"tags":1961,"group":62,"responses":1962,"actionName":1967},"\u002Fapi\u002Fdemo-token","Create a demo token","Mint a short-lived, IP-throttled demo token (stored only in Redis, ~1h TTL) that can render PUBLIC templates with tweaks — no account or API key required. Each client IP can mint up to 5 tokens per rolling hour. Use the token as `Authorization: Bearer demo_…` or `?demo=demo_…` against GET \u002Fapi\u002Frender\u002F:pageId.",[62],{"200":1963,"429":1965},{"description":1964},"Demo token created",{"description":1966},"Per-IP demo token quota reached","createDemoToken",{"path":48,"method":1969,"summary":1970,"description":1971,"tags":1972,"group":1922,"parameters":1973,"responses":2004,"actionName":2011},"GET","Render a page by ID (GET)","Render by page ID with query parameters. Supports draft (database), publish cache, png\u002Fsvg\u002Fwebp\u002Fpdf, JSON or binary responses, tweaks, and brandTweaks — aligned with POST \u002Fapi\u002Frender. Auth depends on template requireGetRenderToken (Bearer or gt query).",[1922],[1974,1978,1984,1987,1991,1994,1997,2000],{"in":1975,"name":663,"required":482,"schema":1976,"description":1977},"path",{"type":262},"Page ID to render",{"in":1979,"name":142,"required":1980,"schema":1981,"description":1983},"query",false,{"type":262,"enum":1982},[147,151,154,157,160],"Output format. Default: png",{"in":1979,"name":173,"required":1980,"schema":1985,"description":1986},{"type":176},"If true, load from database instead of publish cache. Default: false",{"in":1979,"name":193,"required":1980,"schema":1988,"description":1990},{"type":262,"enum":1989},[198,201],"Response shape: omit or json for metadata + file URL; binary for raw bytes",{"in":1979,"name":322,"required":1980,"schema":1992,"description":1993},{"type":262},"Comma-separated page IDs for merged PDF (format=pdf only)",{"in":1979,"name":92,"required":1980,"schema":1995,"description":1996},{"type":262},"GET render secret when Bearer is not used",{"in":1979,"name":217,"required":1980,"schema":1998,"description":1999},{"type":1939,"minimum":442,"maximum":479},"Output resolution multiplier for png\u002Fwebp. Overrides the template's renderScale. Default 2.",{"in":1979,"name":239,"required":1980,"schema":2001,"description":2003},{"type":1939,"minimum":442,"maximum":2002},100,"WebP encode quality (webp only). Overrides the template's webpQuality. Default 90.",{"200":2005,"401":2007,"404":2009},{"description":2006},"Binary image\u002FPDF or application\u002Fjson with file metadata",{"description":2008},"Missing or invalid API token",{"description":2010},"Page or template not found","renderPage",{"path":2013,"method":1918,"summary":2014,"description":2015,"tags":2016,"group":1922,"requestBody":2017,"responses":2056,"actionName":2063},"\u002Fapi\u002Frender\u002Findex","Render by page ID","Render a page by ID from the publish cache, or from the database when draft: true. Requires API token. Does not accept full inline page payloads. Optional body field renderType (satori, takumi, html) overrides the template's rendererType. Use format pdf for the HTML + Chrome PDF pipeline (always uses the HTML renderer). For multi-page PDFs, send pageIds and optional tweaksPerPage (same length). Default response is application\u002Fjson with timings and a URL to the uploaded render; set output to binary (or binary: true) to return raw bytes.",[1922],{"content":2018},{"application\u002Fjson":2019},{"schema":2020},{"type":711,"description":2021,"properties":2022},"For raster formats use pageId. For PDF use pageId (single) or pageIds (merged in order).",{"pageId":2023,"pageIds":2025,"tweaksPerPage":2029,"templateId":2032,"draft":2034,"format":2036,"tweaks":2039,"brandTweaks":2041,"emojiType":2043,"output":2045,"binary":2048,"renderType":2050,"scale":2053,"quality":2055},{"type":262,"description":2024},"Page ID to render (required for png\u002Fsvg\u002Fwebp; optional for pdf when pageIds is set)",{"type":2026,"items":2027,"description":2028},"array",{"type":262},"Multiple pages for merged PDF (format pdf only)",{"type":2026,"items":2030,"description":2031},{"type":711},"Per-page tweaks aligned with pageIds when rendering PDF",{"type":262,"description":2033},"Optional; when set, validated against the page's template (parallel fetch)",{"type":176,"description":2035},"If true, load page and template from database instead of publish cache. Default: false",{"type":262,"enum":2037,"description":2038},[147,151,154,157,160,766],"Output format. Default: png. pdf and pptx use HTML + Chrome; pptx builds an editable slide per page. html5 returns a self-contained HTML5 display-ad ZIP (Google Ads) for a single page.",{"type":711,"description":2040},"Variable overrides; keys may use dot paths for nested values. For Variable[] sources, use \"varId.nested.path\" when patching object values.",{"type":711,"description":2042},"Brand token overrides by dot path (e.g. logos.icon or brand.logos.icon). Merged into resolved brand tokens before render.",{"type":262,"description":2044},"e.g. twemoji, openmoji. Default from template",{"type":262,"enum":2046,"description":2047},[198,201,915,919],"Response shape: omit or json for application\u002Fjson (default); binary, image, or raw for raw body",{"type":176,"description":2049},"If true, same as output binary (raw body)",{"type":262,"enum":2051,"description":2052},[277,280],"Override rendering engine (takumi or html). Ignored when format is pdf (HTML pipeline). Legacy value 'satori' is accepted and treated as 'takumi'.",{"type":1939,"minimum":442,"maximum":479,"description":2054},"Output resolution multiplier for png\u002Fwebp (logical layout unchanged, pixels multiplied). Overrides the template's renderScale. Default 2.",{"type":1939,"minimum":442,"maximum":2002,"description":2003},{"200":2057,"400":2059,"401":2061,"404":2062},{"description":2058},"Default: application\u002Fjson with render metadata and file.url. With output binary: image\u002Fpng, image\u002Fsvg+xml, image\u002Fwebp, or application\u002Fpdf.",{"description":2060},"Invalid body (e.g. missing pageId)",{"description":2008},{"description":2010},"render",{"path":2065,"method":1969,"summary":2066,"description":2067,"tags":2068,"parameters":2069,"responses":2077,"actionName":2082},"\u002Fapi\u002Frenders\u002Flogs","List render logs","Render request logs for the current space, optionally narrowed to one template. Session-authenticated (dashboard login) — not callable with an API key.",[1922],[2070,2072,2074],{"in":1979,"name":259,"required":1980,"description":2071},"Only logs for this template's pages",{"in":1979,"name":21,"required":1980,"description":2073},"Page number",{"in":1979,"name":2075,"required":1980,"description":2076},"perPage","Items per page (default 50)",{"200":2078,"401":2080},{"description":2079},"JSON { list, count, pagesCount } of render log entries",{"description":2081},"Not logged in","listRenderLogs",{"path":2084,"method":1969,"summary":2085,"description":2086,"tags":2087,"parameters":2089,"responses":2100,"actionName":2103},"\u002Fapi\u002Ftemplates\u002Fpublic","List public templates","List published community\u002Fgallery templates with their cached pages. No authentication required.",[2088],"Templates",[2090,2093,2096,2098],{"in":1979,"name":2091,"required":1980,"description":2092},"search","Search name + description (max 80 chars)",{"in":1979,"name":2094,"required":1980,"description":2095},"category","Category filter, or \"featured\" for the curated list",{"in":1979,"name":21,"required":1980,"description":2097},"Page number (default 1)",{"in":1979,"name":2075,"required":1980,"description":2099},"Items per page (max 100)",{"200":2101},{"description":2102},"JSON { list, count, pagesCount } — templates include their published pages","listPublicTemplates",{"path":2105,"method":1969,"summary":2106,"description":2107,"tags":2108,"parameters":2109,"responses":2112,"actionName":2117},"\u002Fapi\u002Ftemplates\u002Fpublic\u002F:id","Get a public template","Fetch one published template (with its pages) by ID. Only templates with publicOn are returned; private IDs 404. No authentication required.",[2088],[2110],{"in":1975,"name":980,"required":482,"description":2111},"Template ID",{"200":2113,"404":2115},{"description":2114},"JSON { doc } — the template including published pages",{"description":2116},"Template not found or not public","getPublicTemplateDoc",{"path":2119,"method":2120,"summary":2121,"description":2122,"tags":2123,"parameters":2124,"responses":2127,"actionName":2132},"\u002Fapi\u002Fv1\u002Fbrands\u002F:id","DELETE","Delete a brand","Soft-delete a brand by ID. Session-authenticated (dashboard login; owner\u002Fadmin\u002Feditor).",[378],[2125],{"in":1975,"name":980,"required":482,"description":2126},"Brand ID",{"200":2128,"404":2130},{"description":2129},"JSON { success: true, id }",{"description":2131},"Brand not found in your space","deleteBrand",{"path":2119,"method":1969,"summary":2134,"description":2135,"tags":2136,"parameters":2137,"responses":2139,"actionName":2144},"Get a brand","Fetch one brand by ID. Public brands (publicOn set) need no auth; private brands require a dashboard session in the owning space. For API-key access use the MCP server (get_brand).",[378],[2138],{"in":1975,"name":980,"required":482,"description":2126},{"200":2140,"404":2142},{"description":2141},"JSON { doc } — the brand with its token sets",{"description":2143},"Not found or not accessible","getBrand",{"path":2119,"method":2146,"summary":2147,"description":2148,"tags":2149,"parameters":2150,"responses":2152,"actionName":2156},"PUT","Update a brand","Update a brand by ID (same fields as create, all optional). Session-authenticated (dashboard login; owner\u002Fadmin\u002Feditor). For API-key access use the MCP server (update_brand).",[378],[2151],{"in":1975,"name":980,"required":482,"description":2126},{"200":2153,"404":2155},{"description":2154},"JSON { doc } — the updated brand",{"description":2131},"updateBrand",{"path":2158,"method":1969,"summary":2159,"description":2160,"tags":2161,"parameters":2162,"responses":2168,"actionName":2173},"\u002Fapi\u002Fv1\u002Fbrands\u002Findex","List brands","List brands in the current space. Session-authenticated (dashboard login); pass ?public=true to list public brands anonymously. For API-key access use the MCP server (list_brands).",[378],[2163,2164,2165],{"in":1979,"name":21,"required":1980,"description":2097},{"in":1979,"name":2075,"required":1980,"description":2076},{"in":1979,"name":2166,"required":1980,"description":2167},"public","\"true\" to list public brands without auth",{"200":2169,"401":2171},{"description":2170},"JSON { list, count, pagesCount } of brands",{"description":2172},"Not logged in (when public is not set)","listBrands",{"path":2158,"method":1918,"summary":2175,"description":2176,"tags":2177,"requestBody":2178,"responses":2197,"actionName":2201},"Create a brand","Create a brand in the current space. Session-authenticated (dashboard login; owner\u002Fadmin\u002Feditor). External image URLs inside tokens are re-uploaded to your space. For API-key access use the MCP server (create_brand).",[378],{"content":2179},{"application\u002Fjson":2180},{"schema":2181},{"type":711,"required":2182,"properties":2184},[2183],"name",{"name":2185,"draftTokens":2187,"liveTokens":2189,"tokens":2191,"variants":2193,"extra":2195},{"type":262,"description":2186},"Brand name",{"type":711,"description":2188},"Token kit being edited (logos, colors, typography, …)",{"type":711,"description":2190},"Token kit used by published renders",{"type":711,"description":2192},"Resolved token set",{"type":711,"description":2194},"Named variations of the kit",{"type":711,"description":2196},"Free-form extras",{"200":2198,"401":2200},{"description":2199},"JSON { doc } — the created brand",{"description":2081},"createBrand",{"path":2203,"method":1969,"summary":2204,"description":2205,"tags":2206,"group":2207,"parameters":2208,"responses":2221,"actionName":2227},"\u002Fapi\u002Fv1\u002Fpublic\u002Fcontent\u002F:collection\u002F:slug","Get an entry","Read a single PUBLISHED entry by slug. Authenticate with a content.read API key (Authorization: Bearer …). The slug is matched against the collection's configured preview.slugField (defaults to \"slug\"). Only liveData is returned; use ?depth= to resolve references and ?variants= for personalization.",[2207],"Content",[2209,2212,2215,2218],{"in":1975,"name":2210,"required":482,"description":2211},"collection","The collection's API name",{"in":1975,"name":2213,"required":482,"description":2214},"slug","The entry slug",{"in":1979,"name":2216,"required":1980,"description":2217},"depth","Resolve reference fields to this depth (default 0)",{"in":1979,"name":2219,"required":1980,"description":2220},"variants","Comma-separated variant ids; returns personalization-resolved values",{"200":2222,"401":2224,"404":2225},{"description":2223},"JSON { doc } — the published entry",{"description":2008},{"description":2226},"Collection or entry not found","publicGetContentBySlug",{"path":2229,"method":1969,"summary":2230,"description":2231,"tags":2232,"group":2207,"parameters":2233,"responses":2240,"actionName":2246},"\u002Fapi\u002Fv1\u002Fpublic\u002Fcontent\u002F:collection\u002Findex","List entries","List PUBLISHED entries in a collection. Authenticate with a content.read API key (Authorization: Bearer …). Only liveData is returned — never drafts. Values under `data` are keyed by field API name. Supports pagination, reference resolution (?depth=), and personalization (?variants=).",[2207],[2234,2235,2236,2238,2239],{"in":1975,"name":2210,"required":482,"description":2211},{"in":1979,"name":21,"required":1980,"description":2097},{"in":1979,"name":2075,"required":1980,"description":2237},"Items per page (default 20)",{"in":1979,"name":2216,"required":1980,"description":2217},{"in":1979,"name":2219,"required":1980,"description":2220},{"200":2241,"401":2243,"404":2244},{"description":2242},"JSON { list, count, pagesCount } of published entries",{"description":2008},{"description":2245},"Collection not found","publicListContent",{"path":2248,"method":2120,"summary":2249,"description":2250,"tags":2251,"responses":2253,"actionName":2258},"\u002Fapi\u002Fv1\u002Fshaders\u002F:id","Delete a shader","Permanently remove a shader from the current space.",[2252],"Shaders",{"200":2254,"404":2256},{"description":2255},"JSON { deleted: true }",{"description":2257},"No such shader","deleteShader",{"path":2248,"method":1969,"summary":2260,"description":2261,"tags":2262,"responses":2263,"actionName":2269},"Get a shader","Fetch one shader including its vetted `program` — the only source a client should compile. Status is enforced here on every request, which is what makes revoking a working kill switch: a quarantined or revoked shader returns 410 and stops loading everywhere immediately.",[2252],{"200":2264,"404":2266,"410":2267},{"description":2265},"JSON { doc }",{"description":2257},{"description":2268},"Shader is quarantined or revoked","getShader",{"path":2248,"method":2146,"summary":2271,"description":2272,"tags":2273,"responses":2274,"actionName":2280},"Update a shader","Editing source or the manifest re-runs the full vetting pipeline and produces a new content hash — an existing approval is never inherited by code that was not vetted. A rejected edit returns 422 and leaves the stored shader untouched.",[2252],{"200":2275,"404":2277,"422":2278},{"description":2276},"JSON { doc, report }",{"description":2257},{"description":2279},"Rejected by vetting; the stored shader is unchanged","updateShader",{"path":2282,"method":1918,"summary":2283,"description":2284,"tags":2285,"responses":2286,"actionName":2289},"\u002Fapi\u002Fv1\u002Fshaders\u002F:id\u002Fstatus","Set a shader status (kill switch)","Revoke, quarantine, or restore a shader. Because GET enforces status on every fetch, revoking stops the shader loading everywhere at once — there is no client deny-list to push and no cache to wait out. Restoring also clears the accumulated watchdog trips.",[2252],{"200":2287,"404":2288},{"description":2265},{"description":2257},"setShaderStatus",{"path":2291,"method":1918,"summary":2292,"description":2293,"tags":2294,"actionName":2295},"\u002Fapi\u002Fv1\u002Fshaders\u002F:id\u002Ftelemetry","Report a client watchdog trip","Called by a viewer whose frame watchdog disabled this shader. Enough independent trips ",[2252],"reportShaderTrip",{"path":2297,"method":1969,"summary":2298,"description":2299,"tags":2300,"parameters":2301,"responses":2309,"actionName":2313},"\u002Fapi\u002Fv1\u002Fshaders\u002Findex","List shaders","List the current space's shaders. Pass ?public=true to list published shaders anonymously. Program source is omitted from the listing — fetch a single shader to obtain it.",[2252],[2302,2303,2304,2307],{"in":1979,"name":21,"required":1980,"description":2097},{"in":1979,"name":2075,"required":1980,"description":2076},{"in":1979,"name":2305,"required":1980,"description":2306},"status","approved | quarantined | revoked",{"in":1979,"name":2166,"required":1980,"description":2308},"\"true\" to list public shaders without auth",{"200":2310,"401":2312},{"description":2311},"JSON { list, count, pagesCount }",{"description":2172},"listShaders",{"path":2297,"method":1918,"summary":2315,"description":2316,"tags":2317,"responses":2318,"actionName":2324},"Create a shader","Submit a GLSL fragment body plus a typed input manifest. The shader is vetted before anything is stored: byte caps, a static policy scan, loop normalisation to constant bounds, a cost model, then a real compile and fuzz render inside a sandboxed child process. A rejected submission returns 422 with the stage-by-stage report and is not saved.",[2252],{"200":2319,"401":2321,"422":2322},{"description":2320},"JSON { doc, report } — the stored shader and its vetting report",{"description":2081},{"description":2323},"Rejected by vetting; data.report explains which stage refused","createShader",{"path":2326,"method":2120,"summary":2327,"description":2328,"tags":2329,"parameters":2331,"responses":2334,"actionName":2339},"\u002Fapi\u002Fv1\u002Ftokens\u002Fapi-keys\u002F:id","Delete an API key","Revoke an API key immediately. Session-authenticated (dashboard login; owner\u002Fadmin).",[2330],"Tokens",[2332],{"in":1975,"name":980,"required":482,"description":2333},"Token ID",{"200":2335,"404":2337},{"description":2336},"JSON { message } confirmation",{"description":2338},"Token not found in your space","deleteApiKey",{"path":2326,"method":2341,"summary":2342,"description":2343,"tags":2344,"parameters":2345,"responses":2347,"actionName":2351},"PATCH","Update an API key","Rename, change expiry, or adjust scopes of an API key. Session-authenticated (dashboard login; owner\u002Fadmin).",[2330],[2346],{"in":1975,"name":980,"required":482,"description":2333},{"200":2348,"404":2350},{"description":2349},"JSON { doc } — the updated key",{"description":2338},"updateApiKey",{"path":2353,"method":1969,"summary":2354,"description":2355,"tags":2356,"parameters":2357,"responses":2360,"actionName":2364},"\u002Fapi\u002Fv1\u002Ftokens\u002Fapi-keys\u002Findex","List API keys","List API keys for the current space. Session-authenticated (dashboard login; owner\u002Fadmin).",[2330],[2358,2359],{"in":1979,"name":21,"required":1980,"description":2097},{"in":1979,"name":2075,"required":1980,"description":2237},{"200":2361,"401":2363},{"description":2362},"JSON { list, count, pagesCount } of API keys",{"description":2081},"listApiKeys",{"path":2353,"method":1918,"summary":2366,"description":2367,"tags":2368,"requestBody":2369,"responses":2385,"actionName":2389},"Create an API key","Create a space-scoped API key. The plain token is returned once, on creation. Session-authenticated (dashboard login; owner\u002Fadmin).",[2330],{"content":2370},{"application\u002Fjson":2371},{"schema":2372},{"type":711,"required":2373,"properties":2374},[2183],{"name":2375,"expiresAt":2377,"neverExpires":2379,"shortToken":2381,"scopes":2383},{"type":262,"description":2376},"Key name (max 200 chars)",{"type":262,"description":2378},"ISO datetime expiry",{"type":176,"description":2380},"No expiry. Default: false",{"type":176,"description":2382},"Shorter ~96-bit token instead of ~256-bit. Default: false",{"type":711,"description":2384},"Optional restrictions: { mcpTools?: string[], apiEndpoints?: string[] }. Omit a list to allow all; [] denies all.",{"200":2386,"401":2388},{"description":2387},"JSON { doc } including the plain token (shown only once)",{"description":2081},"createApiKey",25,"2026-08-19T19:21:11.342Z",1787167272953]