[{"data":1,"prerenderedAt":711},["ShallowReactive",2],{"pricing-plans":3,"content-page-\u002Fdocs\u002Fintegrations\u002Funsplash":4,"api-docs-metadata":200,"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":190,"extension":191,"meta":192,"navigation":195,"path":196,"seo":197,"stem":198,"__hash__":199},"all\u002Fdocs\u002Fintegrations\u002Funsplash.md","Unsplash integration",{"type":8,"value":9,"toc":181},"minimark",[10,15,19,24,37,41,61,65,89,93,118,151,155],[11,12,14],"h1",{"id":13},"unsplash","Unsplash",[16,17,18],"p",{},"The Unsplash integration lets you search the Unsplash photo library and drop royalty-free images straight into your template image layers—no manual download and upload.",[20,21,23],"h2",{"id":22},"what-you-can-do","What you can do",[25,26,27,31,34],"ul",{},[28,29,30],"li",{},"Search the full Unsplash library from inside the editor.",[28,32,33],{},"Place photos directly into image layers and bindings.",[28,35,36],{},"Reuse photos across templates and bulk generation.",[20,38,40],{"id":39},"prerequisites","Prerequisites",[25,42,43,53],{},[28,44,45,46,52],{},"An ",[47,48,14],"a",{"href":49,"rel":50},"https:\u002F\u002Funsplash.com\u002F",[51],"nofollow"," account.",[28,54,55,56,60],{},"An Unsplash ",[57,58,59],"strong",{},"Access Key"," from an Unsplash developer application.",[20,62,64],{"id":63},"get-your-access-key","Get your Access Key",[66,67,68,77,84],"ol",{},[28,69,70,71,76],{},"Sign in at ",[47,72,75],{"href":73,"rel":74},"https:\u002F\u002Funsplash.com\u002Fdevelopers",[51],"unsplash.com\u002Fdevelopers",".",[28,78,79,80,83],{},"Click ",[57,81,82],{},"New Application"," and accept the API terms.",[28,85,86,87,76],{},"Open the application and copy its ",[57,88,59],{},[20,90,92],{"id":91},"connect-unsplash","Connect Unsplash",[66,94,95,101,110,115],{},[28,96,97,98,76],{},"In Bannx, open ",[57,99,100],{},"Settings → Space → Integrations",[28,102,103,104,106,107,76],{},"Find ",[57,105,14],{}," and click ",[57,108,109],{},"Connect",[28,111,112,113,76],{},"Paste your ",[57,114,59],{},[28,116,117],{},"Save.",[119,120,121,137],"table",{},[122,123,124],"thead",{},[125,126,127,131,134],"tr",{},[128,129,130],"th",{},"Field",[128,132,133],{},"Required",[128,135,136],{},"Description",[138,139,140],"tbody",{},[125,141,142,145,148],{},[143,144,59],"td",{},[143,146,147],{},"Yes",[143,149,150],{},"The Access Key from your Unsplash application",[20,152,154],{"id":153},"usage-notes","Usage notes",[25,156,157,169,175],{},[28,158,159,162,163,168],{},[57,160,161],{},"Attribution & licensing:"," Photos are provided under the ",[47,164,167],{"href":165,"rel":166},"https:\u002F\u002Funsplash.com\u002Flicense",[51],"Unsplash License",". Follow Unsplash's attribution and usage guidelines where applicable.",[28,170,171,174],{},[57,172,173],{},"Rate limits:"," Demo Unsplash applications are limited to 50 requests\u002Fhour. Apply for production access in the Unsplash dashboard to raise the limit.",[28,176,177,180],{},[57,178,179],{},"Security:"," Your Access Key is stored against your space and never exposed in rendered output.",{"title":182,"searchDepth":183,"depth":183,"links":184},"",2,[185,186,187,188,189],{"id":22,"depth":183,"text":23},{"id":39,"depth":183,"text":40},{"id":63,"depth":183,"text":64},{"id":91,"depth":183,"text":92},{"id":153,"depth":183,"text":154},"Connect Unsplash to search and place royalty-free photography directly inside Bannx templates.","md",{"layout":193,"updatedAt":194},"docs","2026-06-07",true,"\u002Fdocs\u002Fintegrations\u002Funsplash",{"title":6,"description":190},"docs\u002Fintegrations\u002Funsplash","AtbpJUQzuOJs-R-tVoW4ei1xdIdyx72KbEJiqIYl5RM",{"success":195,"routes":201,"total":709,"generatedAt":710,"canViewAllApiDocs":277},[202,250,262,322,379,400,421,436,452,464,476,493,521,547,566,578,589,600,609,615,633,644,659,671,684],{"path":203,"method":204,"summary":205,"description":206,"tags":207,"group":208,"requestBody":209,"responses":242,"actionName":249},"\u002Fapi\u002Fcode-to-image","POST","Render code snippets as images","Render source code with syntax highlighting to PNG, WebP, or JPEG. No API token required.",[208],"Rendering",{"content":210},{"application\u002Fjson":211},{"schema":212},{"type":213,"required":214,"properties":216},"object",[215],"code",{"code":217,"lang":220,"theme":222,"format":224,"width":230,"height":233,"quality":235,"showLineNumbers":237,"style":240},{"type":218,"description":219},"string","Source code to render",{"type":218,"description":221},"Language for highlighting (e.g. js, ts). Default: js",{"type":218,"description":223},"Shiki theme. Default: github-dark",{"type":218,"enum":225,"description":229},[226,227,228],"png","webp","jpeg","Output format. Default: png (lossless)",{"type":231,"description":232},"number","Optional width",{"type":231,"description":234},"Optional height",{"type":231,"description":236},"Optional quality",{"type":238,"description":239},"boolean","Show 1-based line numbers in a left gutter. Default: false",{"type":213,"description":241},"Optional style options",{"200":243,"400":245,"500":247},{"description":244},"Image (data URL or binary depending on format)",{"description":246},"Missing or invalid code",{"description":248},"Failed to generate code image","codeToImage",{"path":251,"method":204,"summary":252,"description":253,"tags":254,"group":255,"responses":256,"actionName":261},"\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.",[255],"Authentication",{"200":257,"429":259},{"description":258},"Demo token created",{"description":260},"Per-IP demo token quota reached","createDemoToken",{"path":263,"method":264,"summary":265,"description":266,"tags":267,"group":208,"parameters":268,"responses":314,"actionName":321},"\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).",[208],[269,274,284,288,295,299,303,309],{"in":270,"name":271,"required":195,"schema":272,"description":273},"path","pageId",{"type":218},"Page ID to render",{"in":275,"name":276,"required":277,"schema":278,"description":283},"query","format",false,{"type":218,"enum":279},[226,280,227,281,282],"svg","pdf","pptx","Output format. Default: png",{"in":275,"name":285,"required":277,"schema":286,"description":287},"draft",{"type":238},"If true, load from database instead of publish cache. Default: false",{"in":275,"name":289,"required":277,"schema":290,"description":294},"output",{"type":218,"enum":291},[292,293],"json","binary","Response shape: omit or json for metadata + file URL; binary for raw bytes",{"in":275,"name":296,"required":277,"schema":297,"description":298},"pageIds",{"type":218},"Comma-separated page IDs for merged PDF (format=pdf only)",{"in":275,"name":300,"required":277,"schema":301,"description":302},"gt",{"type":218},"GET render secret when Bearer is not used",{"in":275,"name":304,"required":277,"schema":305,"description":308},"scale",{"type":231,"minimum":306,"maximum":307},1,4,"Output resolution multiplier for png\u002Fwebp. Overrides the template's renderScale. Default 2.",{"in":275,"name":310,"required":277,"schema":311,"description":313},"quality",{"type":231,"minimum":306,"maximum":312},100,"WebP encode quality (webp only). Overrides the template's webpQuality. Default 90.",{"200":315,"401":317,"404":319},{"description":316},"Binary image\u002FPDF or application\u002Fjson with file metadata",{"description":318},"Missing or invalid API token",{"description":320},"Page or template not found","renderPage",{"path":323,"method":204,"summary":324,"description":325,"tags":326,"group":208,"requestBody":327,"responses":371,"actionName":378},"\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.",[208],{"content":328},{"application\u002Fjson":329},{"schema":330},{"type":213,"description":331,"properties":332},"For raster formats use pageId. For PDF use pageId (single) or pageIds (merged in order).",{"pageId":333,"pageIds":335,"tweaksPerPage":339,"templateId":342,"draft":344,"format":346,"tweaks":350,"brandTweaks":352,"emojiType":354,"output":356,"binary":361,"renderType":363,"scale":368,"quality":370},{"type":218,"description":334},"Page ID to render (required for png\u002Fsvg\u002Fwebp; optional for pdf when pageIds is set)",{"type":336,"items":337,"description":338},"array",{"type":218},"Multiple pages for merged PDF (format pdf only)",{"type":336,"items":340,"description":341},{"type":213},"Per-page tweaks aligned with pageIds when rendering PDF",{"type":218,"description":343},"Optional; when set, validated against the page's template (parallel fetch)",{"type":238,"description":345},"If true, load page and template from database instead of publish cache. Default: false",{"type":218,"enum":347,"description":349},[226,280,227,281,282,348],"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":213,"description":351},"Variable overrides; keys may use dot paths for nested values. For Variable[] sources, use \"varId.nested.path\" when patching object values.",{"type":213,"description":353},"Brand token overrides by dot path (e.g. logos.icon or brand.logos.icon). Merged into resolved brand tokens before render.",{"type":218,"description":355},"e.g. twemoji, openmoji. Default from template",{"type":218,"enum":357,"description":360},[292,293,358,359],"image","raw","Response shape: omit or json for application\u002Fjson (default); binary, image, or raw for raw body",{"type":238,"description":362},"If true, same as output binary (raw body)",{"type":218,"enum":364,"description":367},[365,366],"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":231,"minimum":306,"maximum":307,"description":369},"Output resolution multiplier for png\u002Fwebp (logical layout unchanged, pixels multiplied). Overrides the template's renderScale. Default 2.",{"type":231,"minimum":306,"maximum":312,"description":313},{"200":372,"400":374,"401":376,"404":377},{"description":373},"Default: application\u002Fjson with render metadata and file.url. With output binary: image\u002Fpng, image\u002Fsvg+xml, image\u002Fwebp, or application\u002Fpdf.",{"description":375},"Invalid body (e.g. missing pageId)",{"description":318},{"description":320},"render",{"path":380,"method":264,"summary":381,"description":382,"tags":383,"parameters":384,"responses":394,"actionName":399},"\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.",[208],[385,388,391],{"in":275,"name":386,"required":277,"description":387},"templateId","Only logs for this template's pages",{"in":275,"name":389,"required":277,"description":390},"page","Page number",{"in":275,"name":392,"required":277,"description":393},"perPage","Items per page (default 50)",{"200":395,"401":397},{"description":396},"JSON { list, count, pagesCount } of render log entries",{"description":398},"Not logged in","listRenderLogs",{"path":401,"method":264,"summary":402,"description":403,"tags":404,"parameters":406,"responses":417,"actionName":420},"\u002Fapi\u002Ftemplates\u002Fpublic","List public templates","List published community\u002Fgallery templates with their cached pages. No authentication required.",[405],"Templates",[407,410,413,415],{"in":275,"name":408,"required":277,"description":409},"search","Search name + description (max 80 chars)",{"in":275,"name":411,"required":277,"description":412},"category","Category filter, or \"featured\" for the curated list",{"in":275,"name":389,"required":277,"description":414},"Page number (default 1)",{"in":275,"name":392,"required":277,"description":416},"Items per page (max 100)",{"200":418},{"description":419},"JSON { list, count, pagesCount } — templates include their published pages","listPublicTemplates",{"path":422,"method":264,"summary":423,"description":424,"tags":425,"parameters":426,"responses":430,"actionName":435},"\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.",[405],[427],{"in":270,"name":428,"required":195,"description":429},"id","Template ID",{"200":431,"404":433},{"description":432},"JSON { doc } — the template including published pages",{"description":434},"Template not found or not public","getPublicTemplateDoc",{"path":437,"method":438,"summary":439,"description":440,"tags":441,"parameters":443,"responses":446,"actionName":451},"\u002Fapi\u002Fv1\u002Fbrands\u002F:id","DELETE","Delete a brand","Soft-delete a brand by ID. Session-authenticated (dashboard login; owner\u002Fadmin\u002Feditor).",[442],"Brands",[444],{"in":270,"name":428,"required":195,"description":445},"Brand ID",{"200":447,"404":449},{"description":448},"JSON { success: true, id }",{"description":450},"Brand not found in your space","deleteBrand",{"path":437,"method":264,"summary":453,"description":454,"tags":455,"parameters":456,"responses":458,"actionName":463},"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).",[442],[457],{"in":270,"name":428,"required":195,"description":445},{"200":459,"404":461},{"description":460},"JSON { doc } — the brand with its token sets",{"description":462},"Not found or not accessible","getBrand",{"path":437,"method":465,"summary":466,"description":467,"tags":468,"parameters":469,"responses":471,"actionName":475},"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).",[442],[470],{"in":270,"name":428,"required":195,"description":445},{"200":472,"404":474},{"description":473},"JSON { doc } — the updated brand",{"description":450},"updateBrand",{"path":477,"method":264,"summary":478,"description":479,"tags":480,"parameters":481,"responses":487,"actionName":492},"\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).",[442],[482,483,484],{"in":275,"name":389,"required":277,"description":414},{"in":275,"name":392,"required":277,"description":393},{"in":275,"name":485,"required":277,"description":486},"public","\"true\" to list public brands without auth",{"200":488,"401":490},{"description":489},"JSON { list, count, pagesCount } of brands",{"description":491},"Not logged in (when public is not set)","listBrands",{"path":477,"method":204,"summary":494,"description":495,"tags":496,"requestBody":497,"responses":516,"actionName":520},"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).",[442],{"content":498},{"application\u002Fjson":499},{"schema":500},{"type":213,"required":501,"properties":503},[502],"name",{"name":504,"draftTokens":506,"liveTokens":508,"tokens":510,"variants":512,"extra":514},{"type":218,"description":505},"Brand name",{"type":213,"description":507},"Token kit being edited (logos, colors, typography, …)",{"type":213,"description":509},"Token kit used by published renders",{"type":213,"description":511},"Resolved token set",{"type":213,"description":513},"Named variations of the kit",{"type":213,"description":515},"Free-form extras",{"200":517,"401":519},{"description":518},"JSON { doc } — the created brand",{"description":398},"createBrand",{"path":522,"method":264,"summary":523,"description":524,"tags":525,"group":526,"parameters":527,"responses":540,"actionName":546},"\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.",[526],"Content",[528,531,534,537],{"in":270,"name":529,"required":195,"description":530},"collection","The collection's API name",{"in":270,"name":532,"required":195,"description":533},"slug","The entry slug",{"in":275,"name":535,"required":277,"description":536},"depth","Resolve reference fields to this depth (default 0)",{"in":275,"name":538,"required":277,"description":539},"variants","Comma-separated variant ids; returns personalization-resolved values",{"200":541,"401":543,"404":544},{"description":542},"JSON { doc } — the published entry",{"description":318},{"description":545},"Collection or entry not found","publicGetContentBySlug",{"path":548,"method":264,"summary":549,"description":550,"tags":551,"group":526,"parameters":552,"responses":559,"actionName":565},"\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=).",[526],[553,554,555,557,558],{"in":270,"name":529,"required":195,"description":530},{"in":275,"name":389,"required":277,"description":414},{"in":275,"name":392,"required":277,"description":556},"Items per page (default 20)",{"in":275,"name":535,"required":277,"description":536},{"in":275,"name":538,"required":277,"description":539},{"200":560,"401":562,"404":563},{"description":561},"JSON { list, count, pagesCount } of published entries",{"description":318},{"description":564},"Collection not found","publicListContent",{"path":567,"method":438,"summary":568,"description":569,"tags":570,"responses":572,"actionName":577},"\u002Fapi\u002Fv1\u002Fshaders\u002F:id","Delete a shader","Permanently remove a shader from the current space.",[571],"Shaders",{"200":573,"404":575},{"description":574},"JSON { deleted: true }",{"description":576},"No such shader","deleteShader",{"path":567,"method":264,"summary":579,"description":580,"tags":581,"responses":582,"actionName":588},"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.",[571],{"200":583,"404":585,"410":586},{"description":584},"JSON { doc }",{"description":576},{"description":587},"Shader is quarantined or revoked","getShader",{"path":567,"method":465,"summary":590,"description":591,"tags":592,"responses":593,"actionName":599},"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.",[571],{"200":594,"404":596,"422":597},{"description":595},"JSON { doc, report }",{"description":576},{"description":598},"Rejected by vetting; the stored shader is unchanged","updateShader",{"path":601,"method":204,"summary":602,"description":603,"tags":604,"responses":605,"actionName":608},"\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.",[571],{"200":606,"404":607},{"description":584},{"description":576},"setShaderStatus",{"path":610,"method":204,"summary":611,"description":612,"tags":613,"actionName":614},"\u002Fapi\u002Fv1\u002Fshaders\u002F:id\u002Ftelemetry","Report a client watchdog trip","Called by a viewer whose frame watchdog disabled this shader. Enough independent trips ",[571],"reportShaderTrip",{"path":616,"method":264,"summary":617,"description":618,"tags":619,"parameters":620,"responses":628,"actionName":632},"\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.",[571],[621,622,623,626],{"in":275,"name":389,"required":277,"description":414},{"in":275,"name":392,"required":277,"description":393},{"in":275,"name":624,"required":277,"description":625},"status","approved | quarantined | revoked",{"in":275,"name":485,"required":277,"description":627},"\"true\" to list public shaders without auth",{"200":629,"401":631},{"description":630},"JSON { list, count, pagesCount }",{"description":491},"listShaders",{"path":616,"method":204,"summary":634,"description":635,"tags":636,"responses":637,"actionName":643},"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.",[571],{"200":638,"401":640,"422":641},{"description":639},"JSON { doc, report } — the stored shader and its vetting report",{"description":398},{"description":642},"Rejected by vetting; data.report explains which stage refused","createShader",{"path":645,"method":438,"summary":646,"description":647,"tags":648,"parameters":650,"responses":653,"actionName":658},"\u002Fapi\u002Fv1\u002Ftokens\u002Fapi-keys\u002F:id","Delete an API key","Revoke an API key immediately. Session-authenticated (dashboard login; owner\u002Fadmin).",[649],"Tokens",[651],{"in":270,"name":428,"required":195,"description":652},"Token ID",{"200":654,"404":656},{"description":655},"JSON { message } confirmation",{"description":657},"Token not found in your space","deleteApiKey",{"path":645,"method":660,"summary":661,"description":662,"tags":663,"parameters":664,"responses":666,"actionName":670},"PATCH","Update an API key","Rename, change expiry, or adjust scopes of an API key. Session-authenticated (dashboard login; owner\u002Fadmin).",[649],[665],{"in":270,"name":428,"required":195,"description":652},{"200":667,"404":669},{"description":668},"JSON { doc } — the updated key",{"description":657},"updateApiKey",{"path":672,"method":264,"summary":673,"description":674,"tags":675,"parameters":676,"responses":679,"actionName":683},"\u002Fapi\u002Fv1\u002Ftokens\u002Fapi-keys\u002Findex","List API keys","List API keys for the current space. Session-authenticated (dashboard login; owner\u002Fadmin).",[649],[677,678],{"in":275,"name":389,"required":277,"description":414},{"in":275,"name":392,"required":277,"description":556},{"200":680,"401":682},{"description":681},"JSON { list, count, pagesCount } of API keys",{"description":398},"listApiKeys",{"path":672,"method":204,"summary":685,"description":686,"tags":687,"requestBody":688,"responses":704,"actionName":708},"Create an API key","Create a space-scoped API key. The plain token is returned once, on creation. Session-authenticated (dashboard login; owner\u002Fadmin).",[649],{"content":689},{"application\u002Fjson":690},{"schema":691},{"type":213,"required":692,"properties":693},[502],{"name":694,"expiresAt":696,"neverExpires":698,"shortToken":700,"scopes":702},{"type":218,"description":695},"Key name (max 200 chars)",{"type":218,"description":697},"ISO datetime expiry",{"type":238,"description":699},"No expiry. Default: false",{"type":238,"description":701},"Shorter ~96-bit token instead of ~256-bit. Default: false",{"type":213,"description":703},"Optional restrictions: { mcpTools?: string[], apiEndpoints?: string[] }. Omit a list to allow all; [] denies all.",{"200":705,"401":707},{"description":706},"JSON { doc } including the plain token (shown only once)",{"description":398},"createApiKey",25,"2026-08-19T19:21:11.342Z",1787167272953]