[{"data":1,"prerenderedAt":773},["ShallowReactive",2],{"api-docs-metadata":3,"icon-harvest":758},{"success":4,"routes":5,"total":756,"generatedAt":757,"canViewAllApiDocs":33},true,[6,24,47,67,80,116,141,159,174,203,221,248,267,351,426,550,598,613,660,673,702,740],{"path":7,"method":8,"summary":9,"description":10,"tags":11,"parameters":13,"responses":18,"actionName":23},"\u002Fapi\u002Fv1\u002Fbrands\u002F:id","GET","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).",[12],"Brands",[14],{"in":15,"name":16,"required":4,"description":17},"path","id","Brand ID",{"200":19,"404":21},{"description":20},"JSON { doc } — the brand with its token sets",{"description":22},"Not found or not accessible","getBrand",{"path":25,"method":8,"summary":26,"description":27,"tags":28,"parameters":29,"responses":41,"actionName":46},"\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).",[12],[30,35,38],{"in":31,"name":32,"required":33,"description":34},"query","page",false,"Page number (default 1)",{"in":31,"name":36,"required":33,"description":37},"perPage","Items per page (default 50)",{"in":31,"name":39,"required":33,"description":40},"public","\"true\" to list public brands without auth",{"200":42,"401":44},{"description":43},"JSON { list, count, pagesCount } of brands",{"description":45},"Not logged in (when public is not set)","listBrands",{"path":48,"method":49,"summary":50,"description":51,"tags":52,"parameters":54,"responses":57,"actionName":66},"\u002Fapi\u002Fv1\u002Fintegrations\u002Fhooks\u002F:id","DELETE","Unsubscribe from an event (integrations)","Removes a subscription made with `POST \u002Fapi\u002Fv1\u002Fintegrations\u002Fhooks`, the way Zapier unsubscribes when a Zap turns off. Only removes subscriptions an integration created, in the key's space. Bearer API key with the `webhook.manage` scope.",[53],"Integrations",[55],{"in":15,"name":16,"required":4,"description":56},"Subscription id returned on subscribe.",{"200":58,"401":60,"403":62,"404":64},{"description":59},"JSON { ok: true, id }",{"description":61},"Missing or invalid API key, or the key lacks the webhook.manage scope (SCOPE_DENIED).",{"description":63},"The key's user may not manage webhooks in the space (FORBIDDEN).",{"description":65},"No integration subscription with that id in the key's space (HOOK_NOT_FOUND).","integrationsUnsubscribeHook",{"path":48,"method":8,"summary":68,"description":69,"tags":70,"parameters":71,"responses":73,"actionName":79},"Get an event subscription (integrations)","Reads a subscription made with `POST \u002Fapi\u002Fv1\u002Fintegrations\u002Fhooks`, so an automation platform can check it still exists before reusing it. 404 means it was removed (in Settings → Developers, or by an unsubscribe) and should be created again. Never returns the signing secret. Bearer API key with the `webhook.manage` scope.",[53],[72],{"in":15,"name":16,"required":4,"description":56},{"200":74,"401":76,"403":77,"404":78},{"description":75},"JSON { id, event, targetUrl, enabled, templateId?, platform?, signed }",{"description":61},{"description":63},{"description":65},"integrationsGetHook",{"path":81,"method":82,"summary":83,"description":84,"tags":85,"requestBody":86,"responses":108,"actionName":115},"\u002Fapi\u002Fv1\u002Fintegrations\u002Fhooks\u002Findex","POST","Subscribe to an event (integrations)","Registers an automation platform's URL for an event, the way Zapier REST hooks subscribe when a Zap turns on. bannx then POSTs `{ id, event, timestamp, spaceId, data }` to `targetUrl` each time the event happens in the key's space; for `render.completed`, `data` holds `templateId`, `format` and `url`. Bearer API key with the `webhook.manage` scope, whose user may manage webhooks in the space. `targetUrl` must be a public HTTPS URL. `templateId` is stored with the subscription so the platform can filter; delivery is not filtered.",[53],{"required":4,"content":87},{"application\u002Fjson":88},{"schema":89},{"type":90,"required":91,"properties":94},"object",[92,93],"targetUrl","event",{"targetUrl":95,"event":98,"templateId":102,"platform":104,"secret":106},{"type":96,"description":97},"string","Public HTTPS URL that receives the events.",{"type":96,"enum":99,"description":101},[100],"render.completed","Event to subscribe to.",{"type":96,"description":103},"Optional template the subscriber cares about.",{"type":96,"description":105},"Who is subscribing, shown in Settings → Developers. Default \"integration\".",{"type":96,"description":107},"Optional, 16-200 characters. bannx then signs each delivery with `X-Webhook-Signature: sha256=\u003Chex HMAC-SHA256 of the raw body>` so the receiver can verify it came from bannx.",{"200":109,"400":111,"401":113,"403":114},{"description":110},"JSON { id, event, targetUrl } — keep `id` to unsubscribe.",{"description":112},"targetUrl is not a public HTTPS URL, or the space has too many integration subscriptions (VALIDATION).",{"description":61},{"description":63},"integrationsSubscribeHook",{"path":117,"method":8,"summary":118,"description":119,"tags":120,"responses":121,"actionName":140},"\u002Fapi\u002Fv1\u002Fintegrations\u002Fme","Who am I (integrations)","Checks an API key and names the space it opens. Automation platforms (Zapier, Make, n8n) call it when a user connects bannx, and show `spaceName` as the connection label. Any valid key works; `scopes.apiEndpoints` lists the REST scopes the key carries (absent = every scope).",[53],{"200":122,"401":138},{"description":123,"content":124},"The key's space.",{"application\u002Fjson":125},{"schema":126},{"type":90,"properties":127},{"spaceId":128,"spaceName":129,"tokenName":130,"creditsRemaining":131,"scopes":133},{"type":96},{"type":96,"nullable":4},{"type":96,"nullable":4},{"type":132,"nullable":4},"number",{"type":90,"nullable":4,"properties":134},{"apiEndpoints":135},{"type":136,"items":137},"array",{"type":96},{"description":139},"Missing or invalid API key (AUTH_REQUIRED, TOKEN_INVALID, TOKEN_EXPIRED).","integrationsMe",{"path":142,"method":8,"summary":143,"description":144,"tags":145,"parameters":146,"responses":153,"actionName":158},"\u002Fapi\u002Fv1\u002Fintegrations\u002Frenders","Recent renders (integrations)","The key's space's latest successful renders, newest first, each shaped like a `render.completed` event: `{ id, event, templateId, format, url, timestamp }`. Automation platforms use it as sample data for a \"New render\" trigger. Bearer API key with the `template.read` scope.",[53],[147,150],{"in":31,"name":148,"required":33,"description":149},"templateId","Only renders of this template.",{"in":31,"name":151,"required":33,"description":152},"limit","1-50. Default 3.",{"200":154,"401":156},{"description":155},"JSON { list: [{ id, event, templateId, format, url, timestamp }] }",{"description":157},"Missing or invalid API key, or the key lacks the template.read scope (SCOPE_DENIED).","integrationsRecentRenders",{"path":160,"method":8,"summary":161,"description":162,"tags":163,"parameters":164,"responses":167,"actionName":173},"\u002Fapi\u002Fv1\u002Fintegrations\u002Ftemplates\u002F:id\u002Ffields","Template fields (integrations)","A template's variables as form fields — key, label, type, required, default and choices — so an automation platform can build the render form. Bearer API key with the `template.read` scope. Types: string, text (long text), number, integer, boolean, image (an image URL), color, list and object (both sent as JSON text, or a list as comma-separated text). Also says whether the template animates, so the form can default to a video format, and lists its saved variations.",[53],[165],{"in":15,"name":16,"required":4,"description":166},"Template ID",{"200":168,"401":170,"404":171},{"description":169},"JSON { id, name, width, height, animated, durationSeconds, fields: [{ key, label, type, required, default?, helpText?, choices? }], variations: [{ id, name }] }",{"description":157},{"description":172},"No template with that id in the key's space (TEMPLATE_NOT_FOUND).","integrationsTemplateFields",{"path":175,"method":82,"summary":176,"description":177,"tags":178,"parameters":179,"requestBody":181,"responses":192,"actionName":202},"\u002Fapi\u002Fv1\u002Fintegrations\u002Ftemplates\u002F:id\u002Frender","Render a template (integrations)","Renders like `POST \u002Fapi\u002Fv1\u002Ftemplates\u002F{id}\u002Frender` and takes the same fields except `raw`, but `variables` may be form text: each value is converted to its variable's type (numbers, booleans, a list as JSON or comma-separated text, an object as JSON), undeclared names are dropped and empty values keep the template's default. Without `callbackUrl` the answer is the render route's JSON. With `callbackUrl` it answers 202 at once and POSTs that JSON to `callbackUrl` when the render finishes, or `{ ok: false, templateId, error: { code, message, status } }` when it fails: for clips that outlast an automation platform's step limit. `callbackUrl` must be a public HTTPS URL. A server restart mid-render loses an async render and no callback arrives. Bearer API key with the `template.render` scope; costs what the same render costs.",[53],[180],{"in":15,"name":16,"required":4,"description":166},{"required":4,"content":182},{"application\u002Fjson":183},{"schema":184},{"type":90,"properties":185},{"callbackUrl":186,"format":188,"variables":190},{"type":96,"description":187},"Public HTTPS URL that receives the render result. Omit to render and answer in one request.",{"type":96,"description":189},"Output format, as on the render route. Default png.",{"type":90,"description":191},"Variable values by name; text is converted to each variable's type.",{"200":193,"202":195,"400":197,"401":199,"404":201},{"description":194},"Without callbackUrl: the render route's JSON { ok, templateId, format, url, creditsCharged, balanceAfter, … }.",{"description":196},"With callbackUrl: JSON { ok: true, status: \"rendering\", templateId } — the result arrives at callbackUrl.",{"description":198},"callbackUrl is not a public HTTPS URL (VALIDATION).",{"description":200},"Missing or invalid API key, or the key lacks the template.render scope (SCOPE_DENIED).",{"description":172},"integrationsRenderWithCallback",{"path":204,"method":8,"summary":205,"description":206,"tags":207,"parameters":208,"responses":216,"actionName":220},"\u002Fapi\u002Fv1\u002Fintegrations\u002Ftemplates\u002Findex","List templates (integrations)","The key's space templates, most recently updated first, for a template picker on an automation platform. Bearer API key with the `template.read` scope. `search` matches the name or description.",[53],[209,212,214],{"in":31,"name":210,"required":33,"description":211},"search","Text the name or description contains.",{"in":31,"name":32,"required":33,"description":213},"1-based page. Default 1.",{"in":31,"name":36,"required":33,"description":215},"Rows per page, 1-100. Default 50.",{"200":217,"401":219},{"description":218},"JSON { list: [{ id, name, description, type, width, height, updatedOn }], count, page, perPage, pagesCount }",{"description":157},"integrationsListTemplates",{"path":222,"method":8,"summary":223,"description":224,"tags":225,"group":226,"parameters":227,"responses":240,"actionName":247},"\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.",[226],"Content",[228,231,234,237],{"in":15,"name":229,"required":4,"description":230},"collection","The collection's API name",{"in":15,"name":232,"required":4,"description":233},"slug","The entry slug",{"in":31,"name":235,"required":33,"description":236},"depth","Resolve reference fields to this depth (default 0)",{"in":31,"name":238,"required":33,"description":239},"variants","Comma-separated variant ids; returns personalization-resolved values",{"200":241,"401":243,"404":245},{"description":242},"JSON { doc } — the published entry",{"description":244},"Missing or invalid API token",{"description":246},"Collection or entry not found","publicGetContentBySlug",{"path":249,"method":8,"summary":250,"description":251,"tags":252,"group":226,"parameters":253,"responses":260,"actionName":266},"\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=).",[226],[254,255,256,258,259],{"in":15,"name":229,"required":4,"description":230},{"in":31,"name":32,"required":33,"description":34},{"in":31,"name":36,"required":33,"description":257},"Items per page (default 20)",{"in":31,"name":235,"required":33,"description":236},{"in":31,"name":238,"required":33,"description":239},{"200":261,"401":263,"404":264},{"description":262},"JSON { list, count, pagesCount } of published entries",{"description":244},{"description":265},"Collection not found","publicListContent",{"path":268,"method":82,"summary":269,"description":270,"tags":271,"parameters":273,"requestBody":275,"responses":337,"actionName":350},"\u002Fapi\u002Fv1\u002Ftemplates\u002F:id\u002Fbulk","Bulk render","Render one file per row of `rows` (each row is variable values by name) and pack them into a ZIP — or, with `format: \"pdf\"` and `output: \"pdf\"`, merge every row into one PDF. Queued: the response is a job id — poll `GET \u002Fapi\u002Fv1\u002Ftemplates\u002Fbulk\u002F{jobId}` for progress and the download URL. Bearer API key with the `template.render` scope; credits for every row are reserved up front.",[272],"Creatives",[274],{"in":15,"name":16,"required":4,"description":166},{"required":4,"content":276},{"application\u002Fjson":277},{"schema":278},{"type":90,"required":279,"properties":281},[280],"rows",{"rows":282,"format":285,"pages":295,"output":299,"dpi":303,"scale":308,"size":312,"fit":314,"fps":319,"quality":323,"variation":328,"variants":330,"brand":335},{"type":136,"items":283,"description":284},{"type":90},"One object per output: variable values by name. Optional `id` \u002F `name` keys name the file; a reserved `_filename` key sets the file name exactly (no extension, never passed to the template). Reserved `_variation` (a saved variation id or name, or several comma-separated) renders that row with its own variation in place of the run's; `_scene` (still formats, counted from 0) renders that page of the row instead of the first. A dotted key fills part of an object or list variable (`to.name`, `items.0.qty`) and keeps the template's saved values for the rest; a string holding JSON (`{…}` \u002F `[…]`) fills an object or list variable. Max 500.",{"type":96,"enum":286,"description":294},[287,288,289,290,291,292,293],"png","webp","svg","pdf","mp4","webm","gif","Output format for every row. Default png.",{"type":96,"enum":296,"description":298},[297],"all","`all`: every page of a still template as its own file, per row (`\u003Crow>-01-\u003Cpage>.png`, …), each page costing a still's credits. png, webp or svg only, and not with a row `_scene`.",{"type":96,"enum":300,"description":302},[301,290],"zip","`zip` (default): one file per row in a ZIP. `pdf`: every row's pages merged, in row order, into one PDF — only with `format: \"pdf\"` (VALIDATION otherwise). Rows that fail are left out and listed in `errors`.",{"type":304,"minimum":305,"maximum":306,"description":307},"integer",72,1200,"PDF only: page size = pixels × 72 \u002F dpi. Unset: the template's export default, else 300 on a print size (A4, Letter, business card, 4×6 label…) so the PDF comes out at paper size, else 72 (1 px = 1 pt).",{"type":132,"minimum":309,"maximum":310,"description":311},0.1,4,"Resolution multiplier. Default 1.",{"type":96,"description":313},"Render every row at another size: a size preset id or WIDTHxHEIGHT (see the single render's `size`). A row may override it with a reserved `_size` field (and `_fit`), e.g. one record as a story and another as a square in the same run.",{"type":96,"enum":315,"description":318},[316,317],"reflow","scale","How the design adapts to `size`. Default reflow.",{"type":304,"minimum":320,"maximum":321,"description":322},1,60,"Video formats only.",{"type":96,"enum":324},[325,326,327],"low","medium","high",{"type":96,"description":329},"Saved variation (id, or its name as the editor shows it) to apply to every row — or several, as a JSON array or comma-separated string, stacked in order (at most one per single-select group). A row's `_variation` replaces it.",{"type":136,"maxItems":331,"items":332,"description":334},10,{"type":96,"description":333},"A variation id or name; a list of them (or a comma-separated string) to combine in one file; or \"\" for the row as it is set.","Render every row once per look: N rows × M looks = N × M files (at most 1000). Each entry is a variation id or name, or several to combine in one file (an array, or comma-separated), stacked on top of the row's `_variation` (else the run's `variation`); `\"\"` is the row as it is set. Files are named `\u003Crow>-\u003Clook name>` (the `\"\"` look keeps `\u003Crow>`), each costing a render.",{"type":96,"description":336},"Render every row under another brand of the key's space — a brandId, brand name or website URL. The template keeps its own brand. Another space's brand is BRAND_NOT_FOUND.",{"200":338,"401":340,"402":342,"404":344,"409":346,"422":348},{"description":339},"JSON { jobId, total }",{"description":341},"Missing or invalid API key, or the key lacks the template.render scope",{"description":343},"Not enough credits for the batch",{"description":345},"Template not found in the key's space, or `brand` names no brand of it (BRAND_NOT_FOUND)",{"description":347},"`brand` matches several brands (BRAND_AMBIGUOUS)",{"description":349},"Invalid body (VALIDATION), e.g. `output: \"pdf\"` with a format other than pdf","creativeBulkApi",{"path":352,"method":8,"summary":353,"description":354,"tags":355,"parameters":356,"responses":414,"actionName":425},"\u002Fapi\u002Fv1\u002Ftemplates\u002F:id\u002Frender","Render a template (GET)","Render a template by ID from the URL alone: options and variables as query parameters, the file streamed back by default (`output=json` stores it and returns `{ url }`). Every query key that is not a render option is a template variable, e.g. `?title=Hello&count=3`; `variables` may also be a JSON object string, and `var.\u003Cname>` \u002F `variables[\u003Cname>]` name a variable that collides with an option. Auth: `Authorization: Bearer` or `?api_token=` — a key in the URL must be scoped to the Template Render API only (a render-only key), so leaking the URL leaks nothing else.",[272],[357,358,361,364,367,370,373,376,378,381,384,387,390,393,396,399,402,405,408,411],{"in":15,"name":16,"required":4,"description":166},{"in":31,"name":359,"description":360},"api_token","A render-only API key (endpoint scope exactly template.render, no MCP tools). Alternative to the Authorization header.",{"in":31,"name":362,"description":363},"format","png (default), webp, svg, pdf, webm, mp4, gif, zip, html5",{"in":31,"name":365,"description":366},"clickUrl","Required for html5: absolute HTTP(S) destination URL",{"in":31,"name":368,"description":369},"loops","HTML5 repetitions: 1–10, default 1",{"in":31,"name":371,"description":372},"network","HTML5 network preset: generic (default), google-ads, dv360, cm360, amazon-dsp, adroll",{"in":31,"name":374,"description":375},"output","`json` to store the file and return { url, timings } instead of the bytes",{"in":31,"name":317,"description":377},"Resolution multiplier 0.25–4",{"in":31,"name":379,"description":380},"quality","standard | high",{"in":31,"name":382,"description":383},"scene","Still formats: scene index. Omit on a pdf of a still (non-animated) template to get every scene as a page.",{"in":31,"name":385,"description":386},"frame","Still formats: frame index within the scene",{"in":31,"name":388,"description":389},"nodeId","Still formats: render one layer",{"in":31,"name":391,"description":392},"variation","Saved variation id, or several comma-separated (stacked in order; at most one per single-select group)",{"in":31,"name":394,"description":395},"brand","Render with another brand of the key's space for this render only: a brandId, brand name or the brand's website URL. The template keeps its own brand. Another space's brand is BRAND_NOT_FOUND (404); a name matching several brands is BRAND_AMBIGUOUS (409).",{"in":31,"name":397,"description":398},"brandVariant","Brand campaign variant id(s), comma-separated",{"in":31,"name":400,"description":401},"draft","`true` renders the current document instead of the published version",{"in":31,"name":403,"description":404},"size","Another output size: a preset id (og, story, leaderboard, …) or WIDTHxHEIGHT; the template is not changed",{"in":31,"name":406,"description":407},"fit","reflow (default) | scale — how the design adapts to `size`",{"in":31,"name":409,"description":410},"dpi","PDF only: print resolution 72–1200 (page = pixels × 72 \u002F dpi points). Default: the template's exportDefaults.dpi, else 300 on a print-size template, else 72",{"in":31,"name":412,"description":413},"variables","JSON object of variables (optional — bare keys work too)",{"200":415,"401":417,"403":419,"404":421,"409":423},{"description":416},"The rendered file (default; `x-credits-charged` \u002F `x-credits-balance` headers carry what it cost), or JSON { ok, templateId, format, url, timings, creditsCharged, balanceAfter, brand? } with output=json",{"description":418},"Missing or invalid API key",{"description":420},"The key lacks the template.render scope, or a URL key is not render-only",{"description":422},"Template not found in the key's space, or `brand` names no brand of the key's space (BRAND_NOT_FOUND)",{"description":424},"`brand` matches several brands of the space (BRAND_AMBIGUOUS)","creativeRenderApiGet",{"path":352,"method":82,"summary":427,"description":428,"tags":429,"parameters":430,"requestBody":432,"responses":499,"actionName":549},"Render a template","Render a creative template by ID to png, webp, svg, pdf, webm, mp4, gif, zip (frame sequence), or html5 (standalone ad ZIP), with variable overrides. Bearer API key with the `template.render` scope. `{{ brand.* }}` resolves against `brand` when given (another brand of the key's space, for this render only), else the template's brand, else the space default. Returns `{ url, creditsCharged, balanceAfter }` with the uploaded render; `raw: true` (or `?format=binary`) streams the bytes instead.",[272],[431],{"in":15,"name":16,"required":4,"description":166},{"required":33,"content":433},{"application\u002Fjson":434},{"schema":435},{"type":90,"properties":436},{"format":437,"clickUrl":441,"loops":443,"network":445,"variables":454,"scale":456,"fps":458,"quality":460,"scene":464,"frame":466,"nodeId":468,"variation":470,"brandVariant":472,"brandVariantMode":475,"brandTokens":480,"brand":482,"draft":484,"size":487,"fit":489,"pages":492,"dpi":495,"raw":497},{"type":96,"enum":438,"description":440},[287,288,289,290,292,291,293,301,439],"html5","Output format. Default png.",{"type":96,"description":442},"Required for html5: HTTP(S) click-through URL.",{"type":304,"minimum":320,"maximum":331,"description":444},"HTML5 playback repetitions. Default 1.",{"type":96,"enum":446,"description":453},[447,448,449,450,451,452],"generic","google-ads","dv360","cm360","amazon-dsp","adroll","HTML5 ad network preset the report is judged against. Default generic.",{"type":90,"description":455},"Variable overrides by name.",{"type":132,"minimum":457,"maximum":310,"description":311},0.25,{"type":304,"minimum":320,"maximum":321,"description":459},"Frames per second for video formats. Default 30.",{"type":96,"enum":461,"description":463},[462,327],"standard","Render quality tier. Default from the template, else high.",{"type":304,"description":465},"Still formats: scene index to render. Omit on a pdf of a still (non-animated) template to get every scene as a page.",{"type":304,"description":467},"Still formats: frame index within the scene.",{"type":96,"description":469},"Still formats: render one layer instead of the artboard.",{"type":96,"description":471},"Saved variation id to apply before rendering — or several, as a JSON array or a comma-separated string, stacked in order: later wins on the same property; at most one per single-select group (VARIATION_CONFLICT).",{"type":136,"items":473,"description":474},{"type":96},"Brand campaign variant ids to render under. Replaces whatever the brand currently has active, so the result is deterministic. Accepts a single id or a comma-separated string too.",{"type":96,"enum":476,"description":479},[477,478],"replace","add","How brandVariant combines with the brand's active set. Default replace.",{"type":90,"description":481},"Brand token values to render with, REPLACING the resolved brand. Use it to render exactly what a preview shows, unsaved edits included. Bounded in size and depth. Exclusive with `brand`.",{"type":96,"description":483},"Render with another brand of the key's space for this render only — a brandId, brand name or the brand's website URL (matched, never fetched). The template keeps its own brand, so concurrent renders under different brands do not race. Another space's brand (public catalog included) is BRAND_NOT_FOUND; a name matching several brands is BRAND_AMBIGUOUS with `data.candidates`.",{"type":485,"description":486},"boolean","Render the current (unpublished) document instead of the published version. Default false: a published template renders its published snapshot; a never-published one renders its draft.",{"type":96,"description":488},"Render at another size without changing the template: a size preset id (e.g. \"og\", \"story\", \"leaderboard\") or \"WIDTHxHEIGHT\" (16–8192 px a side, 64 MP max); an object { preset } or { width, height } is accepted too. The response echoes `size: { width, height, fit, preset?, from }`.",{"type":96,"enum":490,"description":491},[316,317],"How the design adapts to `size`: reflow (layer constraints + auto-layout, default) or scale (uniform scale to fit, letterboxed).",{"type":96,"enum":493,"description":494},[297],"Every page of a still template as one still each — one page per scene, a scene repeated over data one page per item, resolved with this request's variables. Still formats only (png, webp, svg; a pdf already holds every page), exclusive with scene and nodeId, at most 50 pages (PAGE_LIMIT_EXCEEDED). Costs one still per page, reserved up front. The JSON answer is `{ pages: \u003Ccount>, pageUrls: [{ index, name, url, fileId }], zipUrl }`; with `raw` the body is a ZIP (`application\u002Fzip`) of `01-\u003Cpage name>.\u003Cext>`, `02-…`.",{"type":304,"minimum":305,"maximum":306,"description":496},"PDF only: print resolution. Page size = pixels × 72 \u002F dpi points, so a 1200 × 1800 px label at 300 is a 4 × 6 in page. Default: the template's exportDefaults.dpi, else 300 on a print-size template (A4, Letter, business card, 4×6 label…), else 72 (1 px = 1 pt). Out of range is VALIDATION (422).",{"type":485,"description":498},"Stream the file bytes instead of returning JSON.",{"200":500,"401":543,"404":544,"409":545,"422":547},{"description":501,"content":502},"JSON { ok, templateId, format, url, timings, creditsCharged, balanceAfter, brand?, variation?, still?, pages? (pdf), size?, warnings? ([{ nodeId, name, reason }] — layers skipped or drawn as a fallback, SVG\u002FPDF fallbacks, text caught mid-textAnimate, pagination and soundtrack notes) } — or the raw file when `raw`\u002Fbinary is requested (then `x-credits-charged` \u002F `x-credits-balance` headers carry the credits). With `pages: \"all\"`: { ok, templateId, format, pages (count), pageUrls: [{ index, name, url, fileId }], zipUrl, timings, creditsCharged, balanceAfter, … } — or, raw, a ZIP of the numbered stills (`x-page-count` header).",{"application\u002Fjson":503},{"schema":504},{"type":90,"properties":505},{"ok":506,"templateId":507,"format":508,"url":509,"creditsCharged":511,"balanceAfter":513,"brand":515,"pages":520,"pageUrls":522,"zipUrl":534,"warnings":536},{"type":485},{"type":96},{"type":96},{"type":96,"description":510},"The uploaded render.",{"type":132,"description":512},"Credits this render cost the key's space (a still 1, a clip 5, a PDF 1 per page by default).",{"type":132,"description":514},"The space's spendable credits once this render's charge lands. Read when the credits were reserved, so other renders in the same space can move it.",{"type":90,"properties":516,"description":519},{"id":517,"name":518},{"type":96},{"type":96,"nullable":4},"Present when `brand` picked the brand for this render.",{"type":304,"description":521},"How many pages the output holds: a PDF's page count, or the number of stills a `pages: \"all\"` render produced.",{"type":136,"description":523,"items":524},"`pages: \"all\"` only: the rendered pages, in order.",{"type":90,"properties":525},{"index":526,"name":528,"url":530,"fileId":532},{"type":304,"description":527},"0-based page (scene) index — the `scene` a single render takes",{"type":96,"description":529},"the page's name (a templated scene name is filled in)",{"type":96,"description":531},"the page's still",{"type":96,"description":533},"the page's media library file id — what a social post's `fileIds` take (order = slide order)",{"type":96,"description":535},"`pages: \"all\"` only: a ZIP of every page as `01-\u003Cname>.\u003Cext>`, `02-…`.",{"type":136,"items":537,"description":542},{"type":90,"properties":538},{"nodeId":539,"name":540,"reason":541},{"type":96,"nullable":4},{"type":96,"nullable":4},{"type":96},"Where the output differs from the editor, and why: layers skipped or drawn as a fallback (a source that failed to load, a raster past the GPU limit, SVG\u002FPDF layers rasterized or approximated, fonts or images not embedded), text exported mid-textAnimate, PDF pagination notes and video soundtrack notes. nodeId and name are null for document-wide notes.",{"description":341},{"description":422},{"description":546},"`brand` matches several brands of the space (BRAND_AMBIGUOUS, see data.candidates)",{"description":548},"`pages: \"all\"` with a pdf or video format, with scene\u002FnodeId, or on an animated template, or `dpi` outside 72–1200 (VALIDATION); or the set is over 50 pages (PAGE_LIMIT_EXCEEDED)","creativeRenderApi",{"path":551,"method":82,"summary":552,"description":553,"tags":554,"parameters":555,"requestBody":557,"responses":587,"actionName":597},"\u002Fapi\u002Fv1\u002Ftemplates\u002F:id\u002Fsigned-urls","Sign render URLs","Return signed image URLs (`\u002Fr\u002F:id?…&sig=…`) for one variable set or up to 500 rows. A signed URL needs no key or session: the signature covers the template id and every parameter, so it can sit in an email, a CRM field, an OG tag or an `\u003Cimg>` on any site. Each distinct URL renders once (charged like one still) and is served from cache after; republishing the template refreshes them. Still formats only (png, webp), scale ≤ 2, published version only. Requires the template.render scope.",[272],[556],{"in":15,"name":16,"required":4,"description":166},{"required":33,"content":558},{"application\u002Fjson":559},{"schema":560,"example":576},{"type":90,"properties":561},{"variables":562,"rows":564,"options":572,"pages":573},{"type":90,"additionalProperties":4,"description":563},"Variables for ONE URL",{"type":136,"maxItems":565,"description":566,"items":567},500,"Many URLs — one per row; each row may override `options`",{"type":90,"properties":568},{"variables":569,"options":570},{"type":90,"additionalProperties":4},{"$ref":571},"#\u002Fcomponents\u002Fschemas\u002FSignedRenderOptions",{"$ref":571},{"type":96,"enum":574,"description":575},[297],"One URL per PAGE for every row: a still template's scenes (a scene repeated over data is one page per item, resolved with the row's variables), each signed with its `scene` index — so a carousel's keyless links exist before anything renders. Exclusive with `options.scene` and `nodeId`; at most 50 pages a row and 500 URLs a call (PAGE_LIMIT_EXCEEDED \u002F VALIDATION). Each returned row then carries `scene` and `page: { index, name }`.",{"rows":577,"options":586},[578,582],{"variables":579},{"name":580,"plan":581},"Ada","Team",{"variables":583},{"name":584,"plan":585},"Grace","Scale",{"format":288},{"200":588,"401":590,"403":591,"404":593,"422":595},{"description":589},"JSON { templateId, published, urls: [{ url, path, variables, scene?, page? }] } — `published: false` means the URLs will 404 until the template is published; `scene` and `page: { index, name }` appear with `pages: \"all\"`",{"description":418},{"description":592},"The key lacks the template.render scope",{"description":594},"Template not found in the key's space, or `options.brand` names no brand of it (BRAND_NOT_FOUND)",{"description":596},"A variable name collides with a render option, an option is out of range, `pages: \"all\"` is combined with `options.scene` \u002F `nodeId` or signs more than 500 URLs (VALIDATION), or a row resolves to more than 50 pages (PAGE_LIMIT_EXCEEDED)","signTemplateRenderUrlsApi",{"path":599,"method":8,"summary":600,"description":601,"tags":602,"parameters":603,"responses":607,"actionName":612},"\u002Fapi\u002Fv1\u002Ftemplates\u002Fbulk\u002F:jobId","Bulk render status","Progress of a bulk render started with `POST \u002Fapi\u002Fv1\u002Ftemplates\u002F{id}\u002Fbulk`: state, per-row counts, and on completion the download — `zipUrl` for a ZIP run, `fileUrl` for an `output: \"pdf\"` run (one merged PDF); `output` says which. Poll every few seconds until `state` is `completed` or `failed`.",[272],[604],{"in":15,"name":605,"required":4,"description":606},"jobId","Job id from the bulk request",{"200":608,"404":610},{"description":609},"JSON { jobId, state, total, completed, succeeded, failed, currentItem?, errors, output, zipUrl?, fileUrl? }",{"description":611},"No such job in the key's space","creativeBulkStatusApi",{"path":614,"method":8,"summary":615,"description":616,"tags":617,"parameters":619,"responses":656,"actionName":659},"\u002Fapi\u002Fv1\u002Ftemplates\u002Fpublic","List public templates","List published community\u002Fgallery templates from their published snapshots. No authentication required.",[618],"Templates",[620,622,625,635,636,640,644,648,650],{"in":31,"name":210,"required":33,"description":621},"Semantic + keyword search over name, description and each template's design digest (format, palette, fonts, layout), ranked by relevance (\"job application\" finds the hiring posts, \"dark editorial portrait\" finds the look); max 80 chars. Falls back to a substring match when search is unavailable.",{"in":31,"name":623,"required":33,"description":624},"category","Category filter, or \"featured\" for the curated list",{"in":31,"name":362,"required":33,"description":626,"schema":627},"Output format filter: creative (designs — also matches templates with no format set), video, doc, html-ad, mockups, backgrounds",{"type":96,"enum":628},[629,630,631,632,633,634],"creative","video","doc","html-ad","mockups","backgrounds",{"in":31,"name":32,"required":33,"description":34},{"in":31,"name":637,"required":33,"description":638,"schema":639},"usesBrandVariables","Filter published designs: true uses brand-kit variables, false uses none",{"type":485},{"in":31,"name":641,"required":33,"description":642,"schema":643},"isPremium","Filter by access: true lists premium templates only, false lists free ones (anything not flagged premium)",{"type":485},{"in":31,"name":645,"required":33,"description":646,"schema":647},"features","Comma-separated feature tags the published snapshot must ALL carry, from its `features.tags` (e.g. data.loops, data.computation, data.class.fillable, motion.animated, layout.pagination); 1-8 tags. See the Template features section of the templates guide.",{"type":96},{"in":31,"name":36,"required":33,"description":649},"Items per page (max 100)",{"in":31,"name":651,"required":33,"description":652,"schema":653},"view","Row shape. `card` returns only what a gallery card shows: `_id`, `slug`, `name`, `type`, `format`, `category`, `isPremium` (when true), `createdBy`, `thumbnail` (URLs only, variants up to 960 px wide; `src` is omitted when variants exist, use the largest), `thumbnailCurrent`, `contentHash`, `usesBrandVariables`, `width`, `height`, `sampleCount` (stored sample sets), `pages` (page count of a still template whose `templateSettings.pageView` is `carousel`, when above 1: its scenes after scene `repeat` \u002F `if` resolve against the default values, so one scene repeated over a 4-item list counts 4) and, for videos, `video` \u002F `meta` poster URLs, plus `_lean: true`. No document, variables or design digest; fetch one template with GET \u002Fapi\u002Fv1\u002Ftemplates\u002Fpublic\u002F{id} for those. Omit for the full published row.",{"type":96,"enum":654},[655],"card",{"200":657},{"description":658},"JSON { list, count, pagesCount }. Each row is the template as published, or a card row with view=card","listPublicTemplates",{"path":661,"method":8,"summary":662,"description":663,"tags":664,"parameters":665,"responses":667,"actionName":672},"\u002Fapi\u002Fv1\u002Ftemplates\u002Fpublic\u002F:id","Get a public template","Fetch one published template by ID, as published. Only templates with publicOn are returned; private IDs 404. No authentication required.",[618],[666],{"in":15,"name":16,"required":4,"description":166},{"200":668,"404":670},{"description":669},"JSON { doc } — the template as published (creative doc under templateSettings.creative)",{"description":671},"Template not found or not public","getPublicTemplateDoc",{"path":674,"method":8,"summary":675,"description":676,"tags":677,"parameters":679,"responses":696,"actionName":701},"\u002Fapi\u002Fv1\u002Fworkflows\u002F:id\u002Fprocess","Run a workflow (GET)","Embed a workflow output. Auth is Authorization: Bearer or ?api_token=, with the workflow.process scope. GET cannot upload files. With cacheId, serves the cached output (run once via POST, then embed). Otherwise runs from query text inputs (text_\u003CnodeId> or textInputs JSON). Workflows that need an image can only be served from cache. Raw bytes by default; format=json returns metadata. See \u002Fdocs\u002Fworkflows.",[678],"Workflows",[680,682,688,691,694],{"in":15,"name":16,"required":4,"description":681},"Workflow ID",{"in":31,"name":362,"required":33,"schema":683,"description":687},{"type":96,"enum":684},[685,686],"json","binary","binary (default) streams the image; json returns metadata.",{"in":31,"name":689,"required":33,"description":690},"cacheId","Serve this cached output. The usual path for an \u003Cimg src>.",{"in":31,"name":692,"required":33,"description":693},"textInputs","JSON object of { nodeId: value } when there is no cacheId.",{"in":31,"name":359,"required":33,"description":695},"API key, for embedding where a header cannot be set. Same workflow.process scope as Bearer.",{"200":697,"403":699},{"description":698},"Raw image bytes, or JSON metadata when format=json.",{"description":700},"API key missing the workflow.process scope, or not scoped to a space.","processWorkflowGet",{"path":674,"method":82,"summary":703,"description":704,"tags":705,"parameters":706,"requestBody":718,"responses":731,"actionName":739},"Run a workflow","Run a workflow and return its output. Bearer API key with the `workflow.process` scope, belonging to the workflow's space. Body is multipart\u002Fform-data. Omit `format` or pass `json` for metadata, base64 and a file URL; `format=binary` streams the raw bytes (`x-workflow-run-id`, `x-workflow-cache`). `cacheId` stores the output and later calls with the same key return it without re-running. `async=true` returns a job id immediately — poll GET \u002Fapi\u002Fv1\u002Fworkflows\u002F:id\u002Fprocess\u002Fjobs\u002F:jobId. A synchronous call waits about 55 seconds, then returns 202 while the run continues. See \u002Fdocs\u002Fworkflows.",[678],[707,708,712,714],{"in":15,"name":16,"required":4,"description":681},{"in":31,"name":362,"required":33,"schema":709,"description":711},{"type":96,"enum":710},[685,686],"json (default) returns metadata; binary streams the output bytes.",{"in":31,"name":689,"required":33,"description":713},"Opt-in output cache key, 1–128 chars (A–Z a–z 0–9 . _ -).",{"in":31,"name":715,"required":33,"schema":716,"description":717},"async",{"type":485},"If true, enqueue the run and return a jobId.",{"required":33,"content":719},{"multipart\u002Fform-data":720},{"schema":721},{"type":90,"properties":722},{"file":723,"nodeFile_\u003CnodeId>":725,"text_\u003CnodeId>":727,"textInputs":729},{"type":96,"format":686,"description":724},"Primary image input.",{"type":96,"format":686,"description":726},"File for one input node (image or document). Replace \u003CnodeId> with that node's id.",{"type":96,"description":728},"Text for one text-input node. Replace \u003CnodeId> with that node's id.",{"type":96,"description":730},"JSON object of { nodeId: value } for every text input at once.",{"200":732,"202":734,"400":736,"403":738},{"description":733},"JSON { ok, workflowId, runId, status, cached, durationMs, output: { url, base64, mimeType, width, height } }, or the raw bytes when format=binary.",{"description":735},"JSON { ok, runId, status: \"running\", workflowId } when a synchronous run is still going. The run finishes in the background and workflow.executed fires.",{"description":737},"Missing workflow id, or a cacheId that fails the key rules.",{"description":700},"processWorkflow",{"path":741,"method":8,"summary":742,"description":743,"tags":744,"parameters":745,"responses":749,"actionName":755},"\u002Fapi\u002Fv1\u002Fworkflows\u002F:id\u002Fprocess\u002Fjobs\u002F:jobId","Workflow run status","Poll a job enqueued with POST \u002Fapi\u002Fv1\u002Fworkflows\u002F:id\u002Fprocess?async=true. Bearer API key with the workflow.process scope. The job must belong to the key's space and this workflow. state moves waiting, then active, then completed or failed. See \u002Fdocs\u002Fworkflows.",[678],[746,747],{"in":15,"name":16,"required":4,"description":681},{"in":15,"name":605,"required":4,"description":748},"Job id returned by the async process call.",{"200":750,"403":752,"404":753},{"description":751},"JSON { jobId, workflowId, state, progress, result, failedReason }. result is set when state is completed.",{"description":700},{"description":754},"Job not found for this workflow and space.","getWorkflowProcessJob",22,"2026-11-14T17:41:46.371Z",[759,760,761,762,763,764,765,766,767,768,769,770,771,772],"i-ph:caret-down","i-ph:list","i-ph:caret-right","i-ph:copy","i-ph:check","i-ph:x-logo","i-ph:youtube-logo","i-ph:instagram-logo","i-ph:linkedin-logo","i-tabler:brand-producthunt","i-ph:desktop","i-ph:sun","i-ph:moon","i-ph:translate",1794678119518]