[{"data":1,"prerenderedAt":1339},["ShallowReactive",2],{"pricing-plans":3,"content-page-\u002Fdocs\u002Fintegrations\u002Fmcp":4,"api-docs-metadata":848,"i-ph:list":3,"i-ph:caret-right":3,"i-ph:caret-down":3,"i-ph:twitter-logo":3,"i-ph:youtube-logo":3,"i-ph:copy":3},null,{"id":5,"title":6,"body":7,"description":838,"extension":839,"meta":840,"navigation":843,"path":844,"seo":845,"stem":846,"__hash__":847},"all\u002Fdocs\u002Fintegrations\u002Fmcp.md","MCP Server integration",{"type":8,"value":9,"toc":822},"minimark",[10,15,24,42,47,58,61,65,76,87,91,96,103,196,199,261,265,283,357,368,372,382,386,631,635,659,663,687,709,713,755,761,765,785,789,818],[11,12,14],"h1",{"id":13},"mcp-server","MCP Server",[16,17,18,19,23],"p",{},"Bannx exposes a ",[20,21,22],"strong",{},"Model Context Protocol (MCP)"," server so AI assistants (Cursor, the Cursor CLI agent, Claude Desktop, and other MCP clients) can find templates, create templates, and render pages on your behalf.",[16,25,26,27,32,33,37,38,41],{},"Unlike the ",[28,29,31],"a",{"href":30},"\u002Fdocs\u002Fintegrations\u002Funsplash","Unsplash"," and ",[28,34,36],{"href":35},"\u002Fdocs\u002Fintegrations\u002Faws-s3","AWS S3"," integrations, MCP isn't connected from ",[20,39,40],{},"Settings → Space → Integrations",". Instead, you configure it in your MCP client using a Bannx API key.",[43,44,46],"h2",{"id":45},"authentication","Authentication",[16,48,49,50,53,54,57],{},"The MCP server uses the same ",[20,51,52],{},"API keys"," as the REST API. Create one under ",[20,55,56],{},"Settings → Space → Developers",", then pass it as a Bearer token on every MCP request.",[16,59,60],{},"No separate MCP credential is required.",[43,62,64],{"id":63},"endpoint","Endpoint",[66,67,72],"pre",{"className":68,"code":70,"language":71},[69],"language-text","POST https:\u002F\u002Fyour-app.bannx.app\u002Fmcp\nAuthorization: Bearer YOUR_API_KEY\nContent-Type: application\u002Fjson\n","text",[73,74,70],"code",{"__ignoreMap":75},"",[16,77,78,79,82,83,86],{},"The server uses ",[20,80,81],{},"stateless Streamable HTTP"," (MCP spec). Only ",[73,84,85],{},"POST"," is supported.",[43,88,90],{"id":89},"client-configuration","Client configuration",[92,93,95],"h3",{"id":94},"cursor","Cursor",[16,97,98,99,102],{},"Add to your MCP settings (",[73,100,101],{},".cursor\u002Fmcp.json"," or Cursor Settings → MCP):",[66,104,108],{"className":105,"code":106,"language":107,"meta":75,"style":75},"language-json shiki shiki-themes github-light github-dark","{\n  \"mcpServers\": {\n    \"bannx\": {\n      \"url\": \"https:\u002F\u002Fyour-app.bannx.app\u002Fmcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n","json",[73,109,110,119,129,137,153,161,172,178,184,190],{"__ignoreMap":75},[111,112,115],"span",{"class":113,"line":114},"line",1,[111,116,118],{"class":117},"sVt8B","{\n",[111,120,122,126],{"class":113,"line":121},2,[111,123,125],{"class":124},"sj4cs","  \"mcpServers\"",[111,127,128],{"class":117},": {\n",[111,130,132,135],{"class":113,"line":131},3,[111,133,134],{"class":124},"    \"bannx\"",[111,136,128],{"class":117},[111,138,140,143,146,150],{"class":113,"line":139},4,[111,141,142],{"class":124},"      \"url\"",[111,144,145],{"class":117},": ",[111,147,149],{"class":148},"sZZnC","\"https:\u002F\u002Fyour-app.bannx.app\u002Fmcp\"",[111,151,152],{"class":117},",\n",[111,154,156,159],{"class":113,"line":155},5,[111,157,158],{"class":124},"      \"headers\"",[111,160,128],{"class":117},[111,162,164,167,169],{"class":113,"line":163},6,[111,165,166],{"class":124},"        \"Authorization\"",[111,168,145],{"class":117},[111,170,171],{"class":148},"\"Bearer YOUR_API_KEY\"\n",[111,173,175],{"class":113,"line":174},7,[111,176,177],{"class":117},"      }\n",[111,179,181],{"class":113,"line":180},8,[111,182,183],{"class":117},"    }\n",[111,185,187],{"class":113,"line":186},9,[111,188,189],{"class":117},"  }\n",[111,191,193],{"class":113,"line":192},10,[111,194,195],{"class":117},"}\n",[16,197,198],{},"For local development:",[66,200,202],{"className":105,"code":201,"language":107,"meta":75,"style":75},"{\n  \"mcpServers\": {\n    \"bannx\": {\n      \"url\": \"http:\u002F\u002F127.0.0.1:3001\u002Fmcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n",[73,203,204,208,214,220,231,237,245,249,253,257],{"__ignoreMap":75},[111,205,206],{"class":113,"line":114},[111,207,118],{"class":117},[111,209,210,212],{"class":113,"line":121},[111,211,125],{"class":124},[111,213,128],{"class":117},[111,215,216,218],{"class":113,"line":131},[111,217,134],{"class":124},[111,219,128],{"class":117},[111,221,222,224,226,229],{"class":113,"line":139},[111,223,142],{"class":124},[111,225,145],{"class":117},[111,227,228],{"class":148},"\"http:\u002F\u002F127.0.0.1:3001\u002Fmcp\"",[111,230,152],{"class":117},[111,232,233,235],{"class":113,"line":155},[111,234,158],{"class":124},[111,236,128],{"class":117},[111,238,239,241,243],{"class":113,"line":163},[111,240,166],{"class":124},[111,242,145],{"class":117},[111,244,171],{"class":148},[111,246,247],{"class":113,"line":174},[111,248,177],{"class":117},[111,250,251],{"class":113,"line":180},[111,252,183],{"class":117},[111,254,255],{"class":113,"line":186},[111,256,189],{"class":117},[111,258,259],{"class":113,"line":192},[111,260,195],{"class":117},[92,262,264],{"id":263},"cursor-cli-agent","Cursor CLI agent",[16,266,267,268,271,272,274,275,278,279,282],{},"The Cursor CLI agent reads the same config files as the IDE: a global ",[73,269,270],{},"~\u002F.cursor\u002Fmcp.json"," and an optional project-level ",[73,273,101],{},". Add bannx under ",[73,276,277],{},"mcpServers"," (use ",[73,280,281],{},"type: \"http\""," for the remote transport):",[66,284,286],{"className":105,"code":285,"language":107,"meta":75,"style":75},"{\n  \"mcpServers\": {\n    \"bannx\": {\n      \"type\": \"http\",\n      \"url\": \"http:\u002F\u002F127.0.0.1:3001\u002Fmcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n",[73,287,288,292,298,304,316,326,332,340,344,348,352],{"__ignoreMap":75},[111,289,290],{"class":113,"line":114},[111,291,118],{"class":117},[111,293,294,296],{"class":113,"line":121},[111,295,125],{"class":124},[111,297,128],{"class":117},[111,299,300,302],{"class":113,"line":131},[111,301,134],{"class":124},[111,303,128],{"class":117},[111,305,306,309,311,314],{"class":113,"line":139},[111,307,308],{"class":124},"      \"type\"",[111,310,145],{"class":117},[111,312,313],{"class":148},"\"http\"",[111,315,152],{"class":117},[111,317,318,320,322,324],{"class":113,"line":155},[111,319,142],{"class":124},[111,321,145],{"class":117},[111,323,228],{"class":148},[111,325,152],{"class":117},[111,327,328,330],{"class":113,"line":163},[111,329,158],{"class":124},[111,331,128],{"class":117},[111,333,334,336,338],{"class":113,"line":174},[111,335,166],{"class":124},[111,337,145],{"class":117},[111,339,171],{"class":148},[111,341,342],{"class":113,"line":180},[111,343,177],{"class":117},[111,345,346],{"class":113,"line":186},[111,347,183],{"class":117},[111,349,350],{"class":113,"line":192},[111,351,189],{"class":117},[111,353,355],{"class":113,"line":354},11,[111,356,195],{"class":117},[16,358,359,360,363,364,367],{},"Start a new CLI session so the config reloads, then run ",[73,361,362],{},"\u002Fmcp"," to confirm bannx and its tools are listed. Swap the URL to ",[73,365,366],{},"https:\u002F\u002Fyour-app.bannx.app\u002Fmcp"," for production.",[92,369,371],{"id":370},"claude-desktop-remote-http","Claude Desktop (remote HTTP)",[16,373,374,375,32,378,381],{},"Use the same ",[73,376,377],{},"url",[73,379,380],{},"headers"," shape if your client supports remote Streamable HTTP MCP servers.",[43,383,385],{"id":384},"tools","Tools",[387,388,389,402],"table",{},[390,391,392],"thead",{},[393,394,395,399],"tr",{},[396,397,398],"th",{},"Tool",[396,400,401],{},"Description",[403,404,405,416,440,450,463,476,492,502,533,546,556,573,586,596,617],"tbody",{},[393,406,407,413],{},[408,409,410],"td",{},[73,411,412],{},"whoami",[408,414,415],{},"Authenticated space id, user id, and credit summary",[393,417,418,423],{},[408,419,420],{},[73,421,422],{},"list_public_templates",[408,424,425,426,429,430,429,433,429,436,439],{},"Browse the public template gallery (",[73,427,428],{},"search",", ",[73,431,432],{},"category",[73,434,435],{},"page",[73,437,438],{},"perPage",")",[393,441,442,447],{},[408,443,444],{},[73,445,446],{},"list_templates",[408,448,449],{},"List templates in your space",[393,451,452,457],{},[408,453,454],{},[73,455,456],{},"get_template",[408,458,459,460],{},"Get a template and its pages by ",[73,461,462],{},"templateId",[393,464,465,470],{},[408,466,467],{},[73,468,469],{},"create_template",[408,471,472,473,439],{},"Create or update a template (optionally with ",[73,474,475],{},"pages",[393,477,478,483],{},[408,479,480],{},[73,481,482],{},"update_template",[408,484,485,486,488,489,491],{},"Update an existing template by ",[73,487,462],{}," (partial; include ",[73,490,475],{}," to replace all pages)",[393,493,494,499],{},[408,495,496],{},[73,497,498],{},"list_template_pages",[408,500,501],{},"List pages for a template",[393,503,504,509],{},[408,505,506],{},[73,507,508],{},"render_page",[408,510,511,512,515,516,429,519,429,522,525,526,529,530],{},"Render a ",[73,513,514],{},"pageId"," to ",[73,517,518],{},"png",[73,520,521],{},"svg",[73,523,524],{},"webp",", or ",[73,527,528],{},"pdf"," with optional ",[73,531,532],{},"tweaks",[393,534,535,540],{},[408,536,537],{},[73,538,539],{},"list_brands",[408,541,542,543,439],{},"List brands in the space (find a ",[73,544,545],{},"brandId",[393,547,548,553],{},[408,549,550],{},[73,551,552],{},"get_brand",[408,554,555],{},"Get a brand by id including its tokens",[393,557,558,563],{},[408,559,560],{},[73,561,562],{},"create_brand",[408,564,565,566,429,569,572],{},"Create a brand with tokens (",[73,567,568],{},"liveTokens",[73,570,571],{},"draftTokens",", …)",[393,574,575,580],{},[408,576,577],{},[73,578,579],{},"update_brand",[408,581,582,583,585],{},"Update a brand's tokens by ",[73,584,545],{}," (partial; token objects replaced wholesale)",[393,587,588,593],{},[408,589,590],{},[73,591,592],{},"list_icon_collections",[408,594,595],{},"List Iconify icon sets on the icon server",[393,597,598,603],{},[408,599,600],{},[73,601,602],{},"search_icons",[408,604,605,606,609,610,613,614,439],{},"Search icon names by keyword (",[73,607,608],{},"query",", optional ",[73,611,612],{},"prefix"," \u002F ",[73,615,616],{},"prefixes",[393,618,619,624],{},[408,620,621],{},[73,622,623],{},"list_icon_collection",[408,625,626,627,609,629,439],{},"Paginated names within one set (",[73,628,612],{},[73,630,428],{},[92,632,634],{"id":633},"icons-in-templates","Icons in templates",[16,636,637,638,640,641,644,645,429,648,651,652,429,654,525,656,658],{},"For UI icons, use layer type ",[73,639,521],{}," with ",[73,642,643],{},"src"," set to an Iconify name (",[73,646,647],{},"ph:house",[73,649,650],{},"mdi:email-outline","). Do not use emoji in text layers or hand-written inline SVG when an Iconify name exists. Discover names with ",[73,653,592],{},[73,655,602],{},[73,657,623],{}," — the MCP tools proxy the self-hosted icon server.",[92,660,662],{"id":661},"brand-tokens","Brand tokens",[16,664,665,666,669,670,673,674,32,676,678,679,681,682,32,684,686],{},"Brands hold reusable design tokens (colors, typography, logos, images, icons, copy) that templates reference as ",[73,667,668],{},"brand.\u003Cgroup>.\u003Ckey>"," (e.g. ",[73,671,672],{},"brand.colors.primary","). Manage them with ",[73,675,562],{},[73,677,579],{},"; use ",[73,680,539],{}," to find a ",[73,683,545],{},[73,685,552],{}," to read current values before merging.",[16,688,689,690,693,694,696,697,696,699,702,703,705,706,708],{},"Tokens are grouped objects, e.g. ",[73,691,692],{},"liveTokens: { \"colors\": { \"primary\": \"#6366f1\" }, \"typography\": { \"heading\": \"Space Grotesk\" } }",". Rendering prefers ",[73,695,568],{},", then ",[73,698,571],{},[73,700,701],{},"tokens",", so put render-ready values in ",[73,704,568],{},". Each token object passed to ",[73,707,579],{}," replaces the stored one wholesale, so fetch and merge first. External image URLs are re-hosted to the space automatically. Managing brands requires an API token associated with a user.",[92,710,712],{"id":711},"example-workflow","Example workflow",[714,715,716,726,736,748],"ol",{},[717,718,719,720,722,723,725],"li",{},"Call ",[73,721,446],{}," or ",[73,724,422],{}," to find a template.",[717,727,719,728,722,730,732,733,735],{},[73,729,456],{},[73,731,498],{}," to obtain a ",[73,734,514],{},".",[717,737,719,738,640,740,429,742,745,746,735],{},[73,739,508],{},[73,741,514],{},[73,743,744],{},"format",", and optional variable ",[73,747,532],{},[717,749,750,751,754],{},"Use the returned ",[73,752,753],{},"file.url"," from the render response.",[16,756,757,758,735],{},"Renders consume credits from the API key's space, same as ",[73,759,760],{},"POST \u002Fapi\u002Frender",[43,762,764],{"id":763},"security-notes","Security notes",[766,767,768,771,780],"ul",{},[717,769,770],{},"Treat the API key like a password. Anything configured with it can read and render your space's templates and consume credits.",[717,772,773,774,776,777,779],{},"Avoid committing a real key in a project-level ",[73,775,101],{},". Prefer the global ",[73,778,270],{},", or use a placeholder and fill it in locally.",[717,781,782,783,735],{},"Revoke a key anytime from ",[20,784,56],{},[43,786,788],{"id":787},"related-docs","Related docs",[766,790,791,798,804,811],{},[717,792,793,797],{},[28,794,796],{"href":795},"\u002Fdocs\u002Fintegrations","Integrations"," — All available Bannx integrations",[717,799,800,803],{},[28,801,46],{"href":802},"\u002Fdocs\u002Fauthentication"," — API key creation and Bearer usage",[717,805,806,810],{},[28,807,809],{"href":808},"\u002Fdocs\u002Frendering","Rendering"," — Render formats, tweaks, and output modes",[717,812,813,817],{},[28,814,816],{"href":815},"\u002Fdocs\u002Ftemplates","Templates"," — Template and page API reference",[819,820,821],"style",{},"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 .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);}",{"title":75,"searchDepth":121,"depth":121,"links":823},[824,825,826,831,836,837],{"id":45,"depth":121,"text":46},{"id":63,"depth":121,"text":64},{"id":89,"depth":121,"text":90,"children":827},[828,829,830],{"id":94,"depth":131,"text":95},{"id":263,"depth":131,"text":264},{"id":370,"depth":131,"text":371},{"id":384,"depth":121,"text":385,"children":832},[833,834,835],{"id":633,"depth":131,"text":634},{"id":661,"depth":131,"text":662},{"id":711,"depth":131,"text":712},{"id":763,"depth":121,"text":764},{"id":787,"depth":121,"text":788},"Connect AI assistants to Bannx via the Model Context Protocol (MCP) to find templates, create templates, and render pages.","md",{"layout":841,"updatedAt":842},"docs","2026-06-07",true,"\u002Fdocs\u002Fintegrations\u002Fmcp",{"title":6,"description":838},"docs\u002Fintegrations\u002Fmcp","wqWOiaAJh8khYc9P304IYiiMi_nOeri4K-CdAI0q_io",{"success":843,"routes":849,"total":1337,"generatedAt":1338,"canViewAllApiDocs":916},[850,893,904,956,1013,1031,1049,1064,1080,1092,1104,1121,1149,1175,1194,1206,1217,1228,1237,1243,1261,1272,1287,1299,1312],{"path":851,"method":85,"summary":852,"description":853,"tags":854,"group":809,"requestBody":855,"responses":885,"actionName":892},"\u002Fapi\u002Fcode-to-image","Render code snippets as images","Render source code with syntax highlighting to PNG, WebP, or JPEG. No API token required.",[809],{"content":856},{"application\u002Fjson":857},{"schema":858},{"type":859,"required":860,"properties":861},"object",[73],{"code":862,"lang":865,"theme":867,"format":869,"width":873,"height":876,"quality":878,"showLineNumbers":880,"style":883},{"type":863,"description":864},"string","Source code to render",{"type":863,"description":866},"Language for highlighting (e.g. js, ts). Default: js",{"type":863,"description":868},"Shiki theme. Default: github-dark",{"type":863,"enum":870,"description":872},[518,524,871],"jpeg","Output format. Default: png (lossless)",{"type":874,"description":875},"number","Optional width",{"type":874,"description":877},"Optional height",{"type":874,"description":879},"Optional quality",{"type":881,"description":882},"boolean","Show 1-based line numbers in a left gutter. Default: false",{"type":859,"description":884},"Optional style options",{"200":886,"400":888,"500":890},{"description":887},"Image (data URL or binary depending on format)",{"description":889},"Missing or invalid code",{"description":891},"Failed to generate code image","codeToImage",{"path":894,"method":85,"summary":895,"description":896,"tags":897,"group":46,"responses":898,"actionName":903},"\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.",[46],{"200":899,"429":901},{"description":900},"Demo token created",{"description":902},"Per-IP demo token quota reached","createDemoToken",{"path":905,"method":906,"summary":907,"description":908,"tags":909,"group":809,"parameters":910,"responses":948,"actionName":955},"\u002Fapi\u002Frender\u002F:pageId","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).",[809],[911,915,921,925,931,935,939,943],{"in":912,"name":514,"required":843,"schema":913,"description":914},"path",{"type":863},"Page ID to render",{"in":608,"name":744,"required":916,"schema":917,"description":920},false,{"type":863,"enum":918},[518,521,524,528,919],"pptx","Output format. Default: png",{"in":608,"name":922,"required":916,"schema":923,"description":924},"draft",{"type":881},"If true, load from database instead of publish cache. Default: false",{"in":608,"name":926,"required":916,"schema":927,"description":930},"output",{"type":863,"enum":928},[107,929],"binary","Response shape: omit or json for metadata + file URL; binary for raw bytes",{"in":608,"name":932,"required":916,"schema":933,"description":934},"pageIds",{"type":863},"Comma-separated page IDs for merged PDF (format=pdf only)",{"in":608,"name":936,"required":916,"schema":937,"description":938},"gt",{"type":863},"GET render secret when Bearer is not used",{"in":608,"name":940,"required":916,"schema":941,"description":942},"scale",{"type":874,"minimum":114,"maximum":139},"Output resolution multiplier for png\u002Fwebp. Overrides the template's renderScale. Default 2.",{"in":608,"name":944,"required":916,"schema":945,"description":947},"quality",{"type":874,"minimum":114,"maximum":946},100,"WebP encode quality (webp only). Overrides the template's webpQuality. Default 90.",{"200":949,"401":951,"404":953},{"description":950},"Binary image\u002FPDF or application\u002Fjson with file metadata",{"description":952},"Missing or invalid API token",{"description":954},"Page or template not found","renderPage",{"path":957,"method":85,"summary":958,"description":959,"tags":960,"group":809,"requestBody":961,"responses":1005,"actionName":1012},"\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.",[809],{"content":962},{"application\u002Fjson":963},{"schema":964},{"type":859,"description":965,"properties":966},"For raster formats use pageId. For PDF use pageId (single) or pageIds (merged in order).",{"pageId":967,"pageIds":969,"tweaksPerPage":973,"templateId":976,"draft":978,"format":980,"tweaks":984,"brandTweaks":986,"emojiType":988,"output":990,"binary":995,"renderType":997,"scale":1002,"quality":1004},{"type":863,"description":968},"Page ID to render (required for png\u002Fsvg\u002Fwebp; optional for pdf when pageIds is set)",{"type":970,"items":971,"description":972},"array",{"type":863},"Multiple pages for merged PDF (format pdf only)",{"type":970,"items":974,"description":975},{"type":859},"Per-page tweaks aligned with pageIds when rendering PDF",{"type":863,"description":977},"Optional; when set, validated against the page's template (parallel fetch)",{"type":881,"description":979},"If true, load page and template from database instead of publish cache. Default: false",{"type":863,"enum":981,"description":983},[518,521,524,528,919,982],"html5","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":859,"description":985},"Variable overrides; keys may use dot paths for nested values. For Variable[] sources, use \"varId.nested.path\" when patching object values.",{"type":859,"description":987},"Brand token overrides by dot path (e.g. logos.icon or brand.logos.icon). Merged into resolved brand tokens before render.",{"type":863,"description":989},"e.g. twemoji, openmoji. Default from template",{"type":863,"enum":991,"description":994},[107,929,992,993],"image","raw","Response shape: omit or json for application\u002Fjson (default); binary, image, or raw for raw body",{"type":881,"description":996},"If true, same as output binary (raw body)",{"type":863,"enum":998,"description":1001},[999,1000],"takumi","html","Override rendering engine (takumi or html). Ignored when format is pdf (HTML pipeline). Legacy value 'satori' is accepted and treated as 'takumi'.",{"type":874,"minimum":114,"maximum":139,"description":1003},"Output resolution multiplier for png\u002Fwebp (logical layout unchanged, pixels multiplied). Overrides the template's renderScale. Default 2.",{"type":874,"minimum":114,"maximum":946,"description":947},{"200":1006,"400":1008,"401":1010,"404":1011},{"description":1007},"Default: application\u002Fjson with render metadata and file.url. With output binary: image\u002Fpng, image\u002Fsvg+xml, image\u002Fwebp, or application\u002Fpdf.",{"description":1009},"Invalid body (e.g. missing pageId)",{"description":952},{"description":954},"render",{"path":1014,"method":906,"summary":1015,"description":1016,"tags":1017,"parameters":1018,"responses":1025,"actionName":1030},"\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.",[809],[1019,1021,1023],{"in":608,"name":462,"required":916,"description":1020},"Only logs for this template's pages",{"in":608,"name":435,"required":916,"description":1022},"Page number",{"in":608,"name":438,"required":916,"description":1024},"Items per page (default 50)",{"200":1026,"401":1028},{"description":1027},"JSON { list, count, pagesCount } of render log entries",{"description":1029},"Not logged in","listRenderLogs",{"path":1032,"method":906,"summary":1033,"description":1034,"tags":1035,"parameters":1036,"responses":1045,"actionName":1048},"\u002Fapi\u002Ftemplates\u002Fpublic","List public templates","List published community\u002Fgallery templates with their cached pages. No authentication required.",[816],[1037,1039,1041,1043],{"in":608,"name":428,"required":916,"description":1038},"Search name + description (max 80 chars)",{"in":608,"name":432,"required":916,"description":1040},"Category filter, or \"featured\" for the curated list",{"in":608,"name":435,"required":916,"description":1042},"Page number (default 1)",{"in":608,"name":438,"required":916,"description":1044},"Items per page (max 100)",{"200":1046},{"description":1047},"JSON { list, count, pagesCount } — templates include their published pages","listPublicTemplates",{"path":1050,"method":906,"summary":1051,"description":1052,"tags":1053,"parameters":1054,"responses":1058,"actionName":1063},"\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.",[816],[1055],{"in":912,"name":1056,"required":843,"description":1057},"id","Template ID",{"200":1059,"404":1061},{"description":1060},"JSON { doc } — the template including published pages",{"description":1062},"Template not found or not public","getPublicTemplateDoc",{"path":1065,"method":1066,"summary":1067,"description":1068,"tags":1069,"parameters":1071,"responses":1074,"actionName":1079},"\u002Fapi\u002Fv1\u002Fbrands\u002F:id","DELETE","Delete a brand","Soft-delete a brand by ID. Session-authenticated (dashboard login; owner\u002Fadmin\u002Feditor).",[1070],"Brands",[1072],{"in":912,"name":1056,"required":843,"description":1073},"Brand ID",{"200":1075,"404":1077},{"description":1076},"JSON { success: true, id }",{"description":1078},"Brand not found in your space","deleteBrand",{"path":1065,"method":906,"summary":1081,"description":1082,"tags":1083,"parameters":1084,"responses":1086,"actionName":1091},"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).",[1070],[1085],{"in":912,"name":1056,"required":843,"description":1073},{"200":1087,"404":1089},{"description":1088},"JSON { doc } — the brand with its token sets",{"description":1090},"Not found or not accessible","getBrand",{"path":1065,"method":1093,"summary":1094,"description":1095,"tags":1096,"parameters":1097,"responses":1099,"actionName":1103},"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).",[1070],[1098],{"in":912,"name":1056,"required":843,"description":1073},{"200":1100,"404":1102},{"description":1101},"JSON { doc } — the updated brand",{"description":1078},"updateBrand",{"path":1105,"method":906,"summary":1106,"description":1107,"tags":1108,"parameters":1109,"responses":1115,"actionName":1120},"\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).",[1070],[1110,1111,1112],{"in":608,"name":435,"required":916,"description":1042},{"in":608,"name":438,"required":916,"description":1024},{"in":608,"name":1113,"required":916,"description":1114},"public","\"true\" to list public brands without auth",{"200":1116,"401":1118},{"description":1117},"JSON { list, count, pagesCount } of brands",{"description":1119},"Not logged in (when public is not set)","listBrands",{"path":1105,"method":85,"summary":1122,"description":1123,"tags":1124,"requestBody":1125,"responses":1144,"actionName":1148},"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).",[1070],{"content":1126},{"application\u002Fjson":1127},{"schema":1128},{"type":859,"required":1129,"properties":1131},[1130],"name",{"name":1132,"draftTokens":1134,"liveTokens":1136,"tokens":1138,"variants":1140,"extra":1142},{"type":863,"description":1133},"Brand name",{"type":859,"description":1135},"Token kit being edited (logos, colors, typography, …)",{"type":859,"description":1137},"Token kit used by published renders",{"type":859,"description":1139},"Resolved token set",{"type":859,"description":1141},"Named variations of the kit",{"type":859,"description":1143},"Free-form extras",{"200":1145,"401":1147},{"description":1146},"JSON { doc } — the created brand",{"description":1029},"createBrand",{"path":1150,"method":906,"summary":1151,"description":1152,"tags":1153,"group":1154,"parameters":1155,"responses":1168,"actionName":1174},"\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.",[1154],"Content",[1156,1159,1162,1165],{"in":912,"name":1157,"required":843,"description":1158},"collection","The collection's API name",{"in":912,"name":1160,"required":843,"description":1161},"slug","The entry slug",{"in":608,"name":1163,"required":916,"description":1164},"depth","Resolve reference fields to this depth (default 0)",{"in":608,"name":1166,"required":916,"description":1167},"variants","Comma-separated variant ids; returns personalization-resolved values",{"200":1169,"401":1171,"404":1172},{"description":1170},"JSON { doc } — the published entry",{"description":952},{"description":1173},"Collection or entry not found","publicGetContentBySlug",{"path":1176,"method":906,"summary":1177,"description":1178,"tags":1179,"group":1154,"parameters":1180,"responses":1187,"actionName":1193},"\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=).",[1154],[1181,1182,1183,1185,1186],{"in":912,"name":1157,"required":843,"description":1158},{"in":608,"name":435,"required":916,"description":1042},{"in":608,"name":438,"required":916,"description":1184},"Items per page (default 20)",{"in":608,"name":1163,"required":916,"description":1164},{"in":608,"name":1166,"required":916,"description":1167},{"200":1188,"401":1190,"404":1191},{"description":1189},"JSON { list, count, pagesCount } of published entries",{"description":952},{"description":1192},"Collection not found","publicListContent",{"path":1195,"method":1066,"summary":1196,"description":1197,"tags":1198,"responses":1200,"actionName":1205},"\u002Fapi\u002Fv1\u002Fshaders\u002F:id","Delete a shader","Permanently remove a shader from the current space.",[1199],"Shaders",{"200":1201,"404":1203},{"description":1202},"JSON { deleted: true }",{"description":1204},"No such shader","deleteShader",{"path":1195,"method":906,"summary":1207,"description":1208,"tags":1209,"responses":1210,"actionName":1216},"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.",[1199],{"200":1211,"404":1213,"410":1214},{"description":1212},"JSON { doc }",{"description":1204},{"description":1215},"Shader is quarantined or revoked","getShader",{"path":1195,"method":1093,"summary":1218,"description":1219,"tags":1220,"responses":1221,"actionName":1227},"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.",[1199],{"200":1222,"404":1224,"422":1225},{"description":1223},"JSON { doc, report }",{"description":1204},{"description":1226},"Rejected by vetting; the stored shader is unchanged","updateShader",{"path":1229,"method":85,"summary":1230,"description":1231,"tags":1232,"responses":1233,"actionName":1236},"\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.",[1199],{"200":1234,"404":1235},{"description":1212},{"description":1204},"setShaderStatus",{"path":1238,"method":85,"summary":1239,"description":1240,"tags":1241,"actionName":1242},"\u002Fapi\u002Fv1\u002Fshaders\u002F:id\u002Ftelemetry","Report a client watchdog trip","Called by a viewer whose frame watchdog disabled this shader. Enough independent trips ",[1199],"reportShaderTrip",{"path":1244,"method":906,"summary":1245,"description":1246,"tags":1247,"parameters":1248,"responses":1256,"actionName":1260},"\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.",[1199],[1249,1250,1251,1254],{"in":608,"name":435,"required":916,"description":1042},{"in":608,"name":438,"required":916,"description":1024},{"in":608,"name":1252,"required":916,"description":1253},"status","approved | quarantined | revoked",{"in":608,"name":1113,"required":916,"description":1255},"\"true\" to list public shaders without auth",{"200":1257,"401":1259},{"description":1258},"JSON { list, count, pagesCount }",{"description":1119},"listShaders",{"path":1244,"method":85,"summary":1262,"description":1263,"tags":1264,"responses":1265,"actionName":1271},"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.",[1199],{"200":1266,"401":1268,"422":1269},{"description":1267},"JSON { doc, report } — the stored shader and its vetting report",{"description":1029},{"description":1270},"Rejected by vetting; data.report explains which stage refused","createShader",{"path":1273,"method":1066,"summary":1274,"description":1275,"tags":1276,"parameters":1278,"responses":1281,"actionName":1286},"\u002Fapi\u002Fv1\u002Ftokens\u002Fapi-keys\u002F:id","Delete an API key","Revoke an API key immediately. Session-authenticated (dashboard login; owner\u002Fadmin).",[1277],"Tokens",[1279],{"in":912,"name":1056,"required":843,"description":1280},"Token ID",{"200":1282,"404":1284},{"description":1283},"JSON { message } confirmation",{"description":1285},"Token not found in your space","deleteApiKey",{"path":1273,"method":1288,"summary":1289,"description":1290,"tags":1291,"parameters":1292,"responses":1294,"actionName":1298},"PATCH","Update an API key","Rename, change expiry, or adjust scopes of an API key. Session-authenticated (dashboard login; owner\u002Fadmin).",[1277],[1293],{"in":912,"name":1056,"required":843,"description":1280},{"200":1295,"404":1297},{"description":1296},"JSON { doc } — the updated key",{"description":1285},"updateApiKey",{"path":1300,"method":906,"summary":1301,"description":1302,"tags":1303,"parameters":1304,"responses":1307,"actionName":1311},"\u002Fapi\u002Fv1\u002Ftokens\u002Fapi-keys\u002Findex","List API keys","List API keys for the current space. Session-authenticated (dashboard login; owner\u002Fadmin).",[1277],[1305,1306],{"in":608,"name":435,"required":916,"description":1042},{"in":608,"name":438,"required":916,"description":1184},{"200":1308,"401":1310},{"description":1309},"JSON { list, count, pagesCount } of API keys",{"description":1029},"listApiKeys",{"path":1300,"method":85,"summary":1313,"description":1314,"tags":1315,"requestBody":1316,"responses":1332,"actionName":1336},"Create an API key","Create a space-scoped API key. The plain token is returned once, on creation. Session-authenticated (dashboard login; owner\u002Fadmin).",[1277],{"content":1317},{"application\u002Fjson":1318},{"schema":1319},{"type":859,"required":1320,"properties":1321},[1130],{"name":1322,"expiresAt":1324,"neverExpires":1326,"shortToken":1328,"scopes":1330},{"type":863,"description":1323},"Key name (max 200 chars)",{"type":863,"description":1325},"ISO datetime expiry",{"type":881,"description":1327},"No expiry. Default: false",{"type":881,"description":1329},"Shorter ~96-bit token instead of ~256-bit. Default: false",{"type":859,"description":1331},"Optional restrictions: { mcpTools?: string[], apiEndpoints?: string[] }. Omit a list to allow all; [] denies all.",{"200":1333,"401":1335},{"description":1334},"JSON { doc } including the plain token (shown only once)",{"description":1029},"createApiKey",25,"2026-08-19T19:21:11.342Z",1787167270509]