# Render a design or HTML

Source: https://kirora.io/docs/api/reference/renderTemplateContent

`POST /v1/templates/render`

Requires an API key with the `templates:read` scope. [About keys and scopes](https://kirora.io/docs/api/reference/authentication)

Works with integration, agent and partner keys. Also available to embed sessions.

Reads only: safe to retry. [About idempotency](https://kirora.io/docs/api/reference/idempotency)

Renders a block tree and theme sent in the request, or an email written as HTML (`"kind": "html"`), to the HTML and plain text a recipient would get, without saving anything: the builder or code editor preview, plain-text view and HTML export. HTML is returned as saving would keep it, with `HTML_REMOVED` listing what saving removes, `UNSUBSCRIBE_LINK_ADDED` when no link goes to `{{unsubscribe_url}}`, `UNUSABLE_ADDRESS` naming empty, `#` or relative link and image addresses, and `PLACEHOLDER_LINK` naming placeholder addresses (example.com and the like), which sending refuses as it does in a design. With `"context": "marketing"` the HTML shows the postal address and unsubscribe link a marketing send adds when the email lacks them; `"transactional"`, the default, adds nothing and returns the HTML as saving keeps it. To render a saved template, use `POST /v1/templates/{id}/render`. Merge tags show their defaults, or pass `contact` to render them as that contact would see them (not from an embed session). `warnings` flags problems that do not stop rendering, such as an oversized message, or `POSTAL_ADDRESS_MISSING` while the workspace has no `postalAddress` for the footer.

## Header parameters

- `Kirora-Workspace` (string, optional, pattern `^[A-Za-z0-9._:-]{1,128}$`) — Partner keys only: the child workspace to act in, by the external id the partner gave it. Without it, a partner key acts in its own workspace. Any other key that sends it is refused with 403, and an unknown workspace is 404.

## Request body

- One of: **RenderDesignContentInput**
  - `kind` ("design", optional) — `design`: built from blocks in the designer. Left out, `design`.
  - `schemaVersion` (integer, optional, min > 0, max 1000) — The block format version.
  - `blocks` (object[], required, at least 1 item, at most 200 items) — The blocks, rendered top to bottom: at most 200 across the whole tree and five levels including the root. The footer stays at the root.
    - One of: **HeaderBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("header", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `src` (string, optional, up to 2,048 characters) — The logo image's URL; without one, the brand kit's logo.
      - `alt` (string, optional, up to 100,000 characters) — The logo's alt text. Without `src` or a brand kit logo, it shows as a wordmark in the heading font; gallery samples set it to `{{ org.name }}`.
      - `width` (string, optional) — A share of the row ("100%", "66%", "50%"), or a fixed width from "16px" to "600px", such as "120px" for a logo. Never wider than the row.
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
      - `href` (string, optional, up to 2,048 characters) — Where it links: an `https:`, `http:`, `mailto:` or `tel:` address, or a merge tag. `https://` is added to a bare address such as `acme.com/setup`. A draft may hold anything; a button or video whose link is none of these cannot be published or sent.
    - One of: **HeadingBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("heading", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `text` (string, optional, up to 100,000 characters)
      - `size` (string, optional, one of `28px`, `22px`, `18px`)
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
      - `weight` (string, optional, one of `regular`, `bold`)
    - One of: **TextBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("text", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `text` (string, optional, up to 100,000 characters)
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
    - One of: **ImageBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("image", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `src` (string, optional, up to 2,048 characters)
      - `alt` (string, optional, up to 100,000 characters)
      - `width` (string, optional) — A share of the row ("100%", "66%", "50%"), or a fixed width from "16px" to "600px", such as "120px" for a logo. Never wider than the row.
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
      - `href` (string, optional, up to 2,048 characters) — Where it links: an `https:`, `http:`, `mailto:` or `tel:` address, or a merge tag. `https://` is added to a bare address such as `acme.com/setup`. A draft may hold anything; a button or video whose link is none of these cannot be published or sent.
    - One of: **ButtonBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("button", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `text` (string, optional, up to 100,000 characters)
      - `href` (string, optional, up to 2,048 characters) — Where it links: an `https:`, `http:`, `mailto:` or `tel:` address, or a merge tag. `https://` is added to a bare address such as `acme.com/setup`. A draft may hold anything; a button or video whose link is none of these cannot be published or sent.
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
      - `fullWidth` (boolean, optional)
      - `color` (string, optional) — A hex colour, or a theme reference: `accent`, `canvas`, or `accent-tint` / `canvas-tint` (a light tint of it), which follows the theme.
      - `buttonStyle` (string, optional, one of `solid`, `outline`) — This button's style, in place of the theme's.
    - One of: **DividerBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("divider", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `thickness` (integer, optional, min 1, max 10) — Line weight in px.
      - `color` (string, optional) — A hex colour, or a theme reference: `accent`, `canvas`, or `accent-tint` / `canvas-tint` (a light tint of it), which follows the theme.
      - `lineStyle` (string, optional, one of `solid`, `dashed`, `dotted`)
      - `width` (string, optional, one of `100%`, `75%`, `50%`, `25%`) — How much of the row the line spans.
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
    - One of: **SpacerBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("spacer", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `size` (string, optional, pattern `^\d{1,3}px$`) — The height, from "4px" to "200px".
    - One of: **ColumnsBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("columns", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `widths` (integer[], optional, at least 2 items, at most 2 items) — Each column's share of the row in percent, left to right, one per column and adding up to 100, such as [33, 67]. Omit for equal columns.
      - `valign` (string, optional, one of `top`, `middle`, `bottom`) — Where shorter columns sit against the tallest one.
      - `stackOnMobile` (boolean, optional) — False keeps the columns side by side on phones too, such as a two-across product grid; by default they stack.
      - `columns` (object[][], required, at least 2 items, at most 2 items) — The child blocks of each column, left to right: exactly 2 arrays.
    - One of: **Columns3BlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("columns3", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `widths` (integer[], optional, at least 3 items, at most 3 items) — Each column's share of the row in percent, left to right, one per column and adding up to 100, such as [33, 67]. Omit for equal columns.
      - `valign` (string, optional, one of `top`, `middle`, `bottom`) — Where shorter columns sit against the tallest one.
      - `stackOnMobile` (boolean, optional) — False keeps the columns side by side on phones too, such as a two-across product grid; by default they stack.
      - `columns` (object[][], required, at least 3 items, at most 3 items) — The child blocks of each column, left to right: exactly 3 arrays.
    - One of: **ImageTextBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("imagetext", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `src` (string, optional, up to 2,048 characters)
      - `alt` (string, optional, up to 100,000 characters)
      - `text` (string, optional, up to 100,000 characters)
      - `side` (string, optional, one of `left`, `right`) — Which side the image sits on; unset, the start of the reading direction (left, or right in a right-to-left language).
    - One of: **ImageGroupBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("imagegroup", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `count` (2 | 3, optional)
      - `images` (object[], optional, at most 3 items)
        - `src` (string, optional, up to 2,048 characters)
        - `alt` (string, optional, up to 100,000 characters)
    - One of: **BoxedBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("boxed", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `text` (string, optional, up to 100,000 characters)
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
    - One of: **QuoteBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("quote", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `text` (string, optional, up to 100,000 characters)
      - `text2` (string, optional, up to 100,000 characters)
    - One of: **ListBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("list", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `text` (string, optional, up to 100,000 characters)
    - One of: **ProductBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("product", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `weight` (string, optional, one of `regular`, `bold`) — The name and price in bold (the default) or regular weight.
      - `text` (string, optional, up to 100,000 characters)
      - `text2` (string, optional, up to 100,000 characters)
      - `desc` (string, optional, up to 100,000 characters)
      - `href` (string, optional, up to 2,048 characters) — Where it links: an `https:`, `http:`, `mailto:` or `tel:` address, or a merge tag. `https://` is added to a bare address such as `acme.com/setup`. A draft may hold anything; a button or video whose link is none of these cannot be published or sent.
      - `src` (string, optional, up to 2,048 characters)
      - `alt` (string, optional, up to 100,000 characters)
    - One of: **VideoBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("video", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `src` (string, optional, up to 2,048 characters)
      - `alt` (string, optional, up to 100,000 characters)
      - `text` (string, optional, up to 100,000 characters)
      - `href` (string, optional, up to 2,048 characters) — Where it links: an `https:`, `http:`, `mailto:` or `tel:` address, or a merge tag. `https://` is added to a bare address such as `acme.com/setup`. A draft may hold anything; a button or video whose link is none of these cannot be published or sent.
    - One of: **SocialBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("social", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
      - `links` (object[], optional, at most 10 items) — The profiles to show; without any, the brand kit's social links.
        - `label` (string, required, 1–80 characters)
        - `href` (string, required, uri, pattern `^[^\s{}]*$`, up to 2,048 characters)
      - `display` (string, optional, one of `icons`, `both`, `text`) — Each link as its network's icon (the default), the icon and its label, or the label alone. The network is read from the link's address; any other address shows a globe.
      - `iconStyle` (string, optional, one of `color`, `dark`, `light`) — Icons in each network's colour (the default), near-black, or white for a dark background.
    - One of: **MenuBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("menu", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `links` (object[], optional, at most 8 items) — The entries, left to right: at most 8 { label, href }.
        - `label` (string, required, 1–80 characters)
        - `href` (string, required, uri, pattern `^[^\s{}]*$`, up to 2,048 characters)
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
      - `separator` (string, optional, one of `none`, `bar`, `dot`) — What stands between entries: space only, a bar or a dot.
    - One of: **HtmlBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("html", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `text` (string, optional, up to 100,000 characters)
    - One of: **SectionBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("section", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `backgroundImage` (string, optional, pattern `^https:\/\/[^\s"'()<>\\{}]+$`, up to 2,048 characters) — A photo behind the section's blocks, covering the box. Needs `style.backgroundColor`, which Outlook for Windows and clients with images off show instead, and which text is made readable on.
      - `blocks` (object[], required, at least 1 item, at most 200 items) — The section's child blocks, drawn inside its box.
    - One of: **FooterBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("footer", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `text` (string, optional, up to 100,000 characters)
      - `locked` (true, optional)
      - `align` (string, optional, one of `left`, `center`, `right`) — When unset, headings, text, buttons and boxed text start from the reading side (left, or right in a right-to-left language); other blocks centre.
      - `unsubscribeLink` (boolean, optional) — False leaves out the unsubscribe link, for a transactional email (a receipt, a sign-in code). A marketing send adds the sender's own link anyway.
      - `unsubscribeLabel` (string, optional, up to 80 characters) — The words of the unsubscribe link, "Unsubscribe" by default. The link opens a page that also manages topic preferences, so "Unsubscribe or manage preferences" is accurate.
    - One of: **RepeatBlockInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("repeat", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIf` ([object](https://kirora.io/docs/api/models#segment-rules), optional) — Show the block only to contacts these segment rules match, checked as each message is rendered. Omit to show it to everyone.
        - Any of: **Match all**
        - Any of: **Match any**
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `list` (string, required, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — The list to repeat over: `event.properties.<name>` (a journey's event, or a transactional send's `data`) or `contact.attributes.<name>`.
      - `limit` (integer, optional, min 1, max 100)
      - `blocks` (object[], required, at least 1 item, at most 200 items) — The blocks written out once per item of `list`, where `{{ item.<field> }}` reads that item. Repeats do not nest.
    - One of: **SharedBlockReferenceInput**
      - `id` (string, required, 1–128 characters) — Identifies the block within the template; unique among its blocks.
      - `type` ("shared", required)
      - `style` (EmailBlockStyleInput, optional) — Visual overrides for this block, such as colours, font and spacing.
        - `backgroundColor` (string, optional) — Fill behind the block.
        - `fontFamily` (string, optional, one of `arial`, `verdana`, `georgia`, `tahoma`, `times-new-roman`, `courier-new`, `inter`, `roboto`, `open-sans`, `lato`, `montserrat`, `poppins`, `dm-sans`, `nunito`, `work-sans`, `oswald`, `ubuntu`, `mulish`, `manrope`, `quicksand`, `rubik`, `josefin-sans`, `epilogue`, `noto-sans`, `space-grotesk`, `plus-jakarta-sans`, `outfit`, `bricolage-grotesque`, `sora`, `ibm-plex-sans`, `geist`, `space-mono`, `playfair-display`, `merriweather`, `lora`, `libre-baskerville`, `eb-garamond`, `fraunces`, `source-serif-4`, `cormorant-garamond`) — A font id: one every client has (arial, verdana, georgia, tahoma, times-new-roman, courier-new), or a web font, which shows where the client loads it and falls back to a safe font elsewhere. Form themes use the same ids.
        - `fontSize` (integer, optional, min 12, max 72) — Text size in px, 12 to 72.
        - `mobileFontSize` (integer, optional, min 12, max 72) — Text size in px on phones (screens up to 620px), 12 to 72. Email apps that ignore mobile styles use `fontSize`.
        - `padding` (object, optional) — Space inside the block in px, 0 to 100 per side; omitted sides keep their default.
        - `mobilePadding` (object, optional) — Space inside the block in px on phones (screens up to 620px), 0 to 100 per side; omitted sides keep the block's `padding` (or its default). Email apps that ignore mobile styles use `padding`.
        - `borderWidth` (integer, optional, min 0, max 10) — Border thickness in px; 0 for none.
        - `borderStyle` (string, optional, one of `solid`, `dashed`, `dotted`) — Border line style.
        - `borderColor` (string, optional) — Border colour.
        - `borderRadius` (integer, optional, min 0, max 100) — Corner rounding in px, 0 to 100.
        - `textColor` (string, optional) — Text colour.
        - `linkColor` (string, optional) — Colour of links in the text.
        - `linkUnderline` (boolean, optional) — Set to false for links without an underline, such as a row of rating numbers or stars.
        - `letterSpacing` (number, optional, min -2, max 20) — Space between letters in px, such as 3 for a spaced-out eyebrow line.
        - `textTransform` (string, optional, one of `none`, `uppercase`) — Set to `uppercase` to capitalise all text.
        - `lineHeight` (number, optional, min 1, max 3) — A multiple of the font size.
        - `fontWeight` (string, optional, one of `regular`, `bold`) — Text weight.
        - `fontStyle` (string, optional, one of `normal`, `italic`) — Text style.
        - `inset` (boolean, optional) — Draw the background and border as a box within the content width, not across the whole row.
      - `visibleIfPresent` (string, optional, pattern `^(?:contact\.attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}|(?:event\.properties|data)\.[A-Za-z0-9_.-]+)$`) — Show the block only when this value is present (not missing, empty or false), such as `data.vat` for a VAT row; checked as each message is rendered.
      - `showOn` (string, optional, one of `mobile`, `desktop`) — Show the block only on phones (screens up to 620px) or only on wider screens. Clients that ignore screen size show the desktop version, and so does plain text. Omit to show it everywhere.
      - `sharedBlockId` (string, required, uuid) — The workspace's shared block placed here, by reference.
      - `override` (object[], optional, at least 1 item, at most 200 items) — Edited here only: these blocks render instead of the shared content. Omit to follow the shared block.
  - `theme` (EmailThemeInput, optional) — Theme values this email overrides. Defaults to `{}`, which keeps the workspace brand kit.
    - `bodyFontFamily` (string, optional, pattern `^[\w\s,'"-]+$`, up to 200 characters) — Body font stack, such as `Inter, sans-serif`.
    - `headingFontFamily` (string, optional, pattern `^[\w\s,'"-]+$`, up to 200 characters) — Heading font stack.
    - `cardBackgroundColor` (string, optional, pattern `^#(?:[0-9a-f]{3}|[0-9a-f]{6})$`) — Background of the email card, as hex.
    - `canvasBackgroundColor` (string, optional, pattern `^#(?:[0-9a-f]{3}|[0-9a-f]{6})$`) — Background behind the card, as hex.
    - `textColor` (string, optional, pattern `^#(?:[0-9a-f]{3}|[0-9a-f]{6})$`) — Default text colour, as hex.
    - `accentColor` (string, optional, pattern `^#(?:[0-9a-f]{3}|[0-9a-f]{6})$`) — Brand colour for buttons and highlights, as hex.
    - `linkColor` (string, optional, pattern `^#(?:[0-9a-f]{3}|[0-9a-f]{6})$`) — Link colour, as hex.
    - `headingColor` (string, optional, pattern `^#(?:[0-9a-f]{3}|[0-9a-f]{6})$`) — Heading colour, as hex; unset, headings take `textColor`.
    - `buttonTextColor` (string, optional, pattern `^#(?:[0-9a-f]{3}|[0-9a-f]{6})$`) — Label colour of solid buttons in `accentColor`, as hex; unset, white or near-black, whichever reads on it.
    - `baseFontSize` (string, optional, one of `14px`, `15px`, `16px`, `17px`, `18px`) — Body text size; headings and buttons scale with it. Unset is `16px`.
    - `cardWidth` (string, optional, one of `560px`, `600px`, `680px`) — Width of the email card on wide screens.
    - `cardBorderRadius` (string, optional, one of `0px`, `6px`, `12px`, `16px`, `24px`, `999px`) — Corner rounding of the email's card.
    - `buttonBorderRadius` (string, optional, one of `0px`, `6px`, `12px`, `16px`, `24px`, `999px`) — Button corners; `cardBorderRadius` rounds the email's card and, when this is unset, buttons.
    - `buttonStyle` (string, optional, one of `solid`, `outline`) — Button style.
  - `language` (string, optional, up to 35 characters) — The language the email is written in, as a BCP 47 tag ("en", "fr-BE", "ar"). It sets the HTML `lang` and the reading direction: Arabic, Hebrew, Persian, Urdu and other right-to-left languages render right to left. Defaults to "en".
  - `plainTextOverride` (string | null, optional, up to 100,000 characters) — Plain text used instead of the version generated from the design or HTML.
  - `contact` (object, optional) — A contact whose values fill the merge tags and decide each block's `visibleIf`. Without one, merge tags show their defaults.
    - Any of: **By contact id**
      - `contactId` (string, required, uuid) — Kirora's id for the contact.
    - Any of: **By external id**
      - `externalId` (string, required, 1–255 characters) — Your own id for the contact, as set with identify.
    - Any of: **By email**
      - `email` (string, required) — The contact's email address, matched trimmed and without case.
  - `subject` (string, optional, 1–998 characters) — The subject line, returned rendered.
  - `data` (map<string, any>, optional, keys: pattern `^[A-Za-z0-9_-]{1,64}$`) — Sample data for `{{ event.properties.* }}` tags and repeat lists: what a transactional send's `data` or a journey's event would carry. Without it, a repeat shows once with its item tags as written.
- One of: **RenderHtmlContentInput**
  - `kind` ("html", required) — `html`: the whole email written as HTML, kept as code.
  - `html` (string, required, up to 512,000 characters) — The whole email as HTML. Merge tags work as in a design; `{{unsubscribe_url}}` as a link's href places the unsubscribe link, which marketing sends otherwise get below the email, with the workspace postal address when the email does not show it.
  - `context` (string, optional, one of `marketing`, `transactional`, default `"transactional"`) — HTML only. `marketing`: the email as a marketing send has it, with the postal address and an unsubscribe link (`{{unsubscribe_url}}`; `#` in a test send) added below when the HTML does not show them. `transactional` (the default): nothing is added, as a transactional send adds nothing, and the HTML is as saving keeps it.
  - `plainTextOverride` (string | null, optional, up to 100,000 characters) — Plain text used instead of the version generated from the design or HTML.
  - `contact` (object, optional) — A contact whose values fill the merge tags and decide each block's `visibleIf`. Without one, merge tags show their defaults.
    - Any of: **By contact id**
      - `contactId` (string, required, uuid) — Kirora's id for the contact.
    - Any of: **By external id**
      - `externalId` (string, required, 1–255 characters) — Your own id for the contact, as set with identify.
    - Any of: **By email**
      - `email` (string, required) — The contact's email address, matched trimmed and without case.
  - `subject` (string, optional, 1–998 characters) — The subject line, returned rendered.
  - `data` (map<string, any>, optional, keys: pattern `^[A-Za-z0-9_-]{1,64}$`) — Sample data for `{{ event.properties.* }}` tags and repeat lists: what a transactional send's `data` or a journey's event would carry. Without it, a repeat shows once with its item tags as written.

## Returns

Returns `200 OK` with a `TemplateRender` in `data`. It can also return `409 Conflict`, `413 Payload Too Large` or `415 Unsupported Media Type`; see the statuses below. Otherwise returns an error; [Errors](https://kirora.io/docs/api/reference/errors) lists every code and which to retry.

- `html` (string, required) — The rendered HTML.
- `text` (string, required) — The rendered plain-text version.
- `subject` (string, optional) — The subject with merge tags filled in.
- `sizeBytes` (integer, required, min 0) — Size of the HTML in bytes.
- `warnings` (object[], required) — Problems that do not stop rendering, such as a size that risks clipping.
  - `code` (string, required) — A stable code for the kind of problem.
  - `title` (string, required) — A short summary.
  - `detail` (string, required) — What is wrong and how to fix it.

Statuses:

- `200 OK`: The rendered HTML, plain text, size and warnings.
- `409 Conflict`: The request conflicts with current state — a duplicate unique value, or a resource whose status does not allow this operation.
- `413 Payload Too Large`: The body is larger than this operation accepts (`PAYLOAD_TOO_LARGE`).
- `415 Unsupported Media Type`: The body is not JSON, or not the upload the operation takes (`UNSUPPORTED_MEDIA_TYPE`).

## Example: Render a design for one contact without saving it

```bash
curl -X POST https://api.kirora.io/v1/templates/render \
  -H "Authorization: Bearer $KIRORA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "blocks": [
      {
        "id": "title",
        "type": "heading",
        "text": "Welcome to Acme Shop",
        "size": "28px"
      },
      {
        "id": "intro",
        "type": "text",
        "text": "Hi {{ contact.firstName }}, thanks for joining. Your first order ships free."
      },
      {
        "id": "shop",
        "type": "button",
        "text": "Start shopping",
        "href": "https://acme-shop.com"
      },
      {
        "id": "store-footer",
        "type": "shared",
        "sharedBlockId": "0192f3d1-3c4d-7e5f-8a61-7c8d9e0f1a2b"
      },
      {
        "id": "footer",
        "type": "footer",
        "text": "{{ org.name }}\n{{ org.address }}",
        "locked": true
      }
    ],
    "theme": {
      "bodyFontFamily": "Arial, sans-serif",
      "headingFontFamily": "Georgia, serif",
      "cardBackgroundColor": "#ffffff",
      "canvasBackgroundColor": "#f4f1ec",
      "textColor": "#1f2933",
      "accentColor": "#b4461f",
      "linkColor": "#b4461f",
      "cardWidth": "600px",
      "cardBorderRadius": "6px",
      "buttonStyle": "solid"
    },
    "contact": {
      "contactId": "0192f3a1-7c2e-7d4b-9a10-3e5f6a7b8c9d"
    },
    "subject": "Welcome to Acme Shop"
  }'
```

Response `200`:

```json
{
  "data": {
    "html": "<!doctype html><html><body><h1>Welcome to Acme Shop</h1><p>Hi Amaka, thanks for joining. Your first order ships free.</p></body></html>",
    "text": "Welcome to Acme Shop\n\nHi Amaka, thanks for joining. Your first order ships free.\n\nStart shopping: https://acme-shop.com",
    "subject": "Welcome to Acme Shop",
    "sizeBytes": 2048,
    "warnings": []
  }
}
```

## Example: Preview HTML in the code editor: what saving keeps, and what it removes

```bash
curl -X POST https://api.kirora.io/v1/templates/render \
  -H "Authorization: Bearer $KIRORA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "html",
    "html": "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><style>p{font-family:Arial,sans-serif}</style></head><body><h1>The Acme Shop monthly</h1><p>Hi {{ contact.firstName | default: \"there\" }}, here is what is new.</p><p><a href=\"{{unsubscribe_url}}\">Unsubscribe</a></p><script>track()</script></body></html>"
  }'
```

Response `200`:

```json
{
  "data": {
    "html": "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><style>p{font-family:Arial,sans-serif}</style></head><body><h1>The Acme Shop monthly</h1><p>Hi there, here is what is new.</p><p><a href=\"{{unsubscribe_url}}\">Unsubscribe</a></p></body></html>",
    "text": "The Acme Shop monthly\n\nHi there, here is what is new.\n\nUnsubscribe ({{unsubscribe_url}})",
    "sizeBytes": 255,
    "warnings": [
      {
        "code": "HTML_REMOVED",
        "title": "Some code is removed",
        "detail": "Saving removes scripts. Email apps do not run them, so the email looks the same in an inbox."
      }
    ]
  }
}
```
