Email

Klaviyo email heroes

An agent generates on-brand email hero, header, and promo stills with Brandiseer; a person places imageUrl in a Klaviyo template image block or the image library. Brandiseer does not push into Klaviyo and does not send campaigns.

~25 to 40 min setup
  • MCP
  • REST
  • Cursor
  • Cowork

Brandiseer + Klaviyo (+ Cursor or Claude Cowork)

Cover: an on-brand email hero ready to place in a Klaviyo image block

By the end of this guide you will have a repeatable way to make on-brand stills for Klaviyo emails. An agent in Cursor or Claude Cowork calls Brandiseer, gets an imageUrl for an email hero, a header still, or a promo image, and a person places that file in Klaviyo.

Brandiseer owns the brand memory and the still. Klaviyo owns the template, the campaign, and the flow. Brandiseer does not open Klaviyo, does not upload into the image library by itself, and does not send the campaign or change a flow. A person downloads the file or copies imageUrl, then uses an image block (Import Image, upload, or Image Library) or uploads it under Content > Images & brand > Images. Optional Images API imports are documented only where Klaviyo's own developer pages describe them. An import lands the file in the library. It does not assign an image block, and it does not send.

People who brief stills inside Slack should use Slack creative desk. Recurring captions and Buffer scheduling should use Social media automation. Schedules and webhooks in Zapier, Make, or n8n should use Always-on creative automation. Site heroes that live in Webflow should use Webflow site visuals. HubSpot emails, landing pages, and ads should use HubSpot campaign creatives. This guide does not recreate any of those. It is Klaviyo email placement only.

Who it's for

  • Lifecycle, CRM, and email marketers who already send in Klaviyo and need a hero, a header still, or a promo image without opening a separate design tool for every campaign or flow
  • Agencies that keep one Brandiseer Brand ID per client and one Klaviyo account per client
  • Operators who can paste an imageUrl into a Klaviyo image block, or upload the file into the image library and then assign it

Ideal customer profile: a team whose campaigns and flows already live in Klaviyo, whose brand already lives in Brandiseer, and whose missing piece is a brand-safe still plus a clear handoff into an image block or the image library.

Why Brandiseer in this stack

Klaviyo is where the email is built and sent. Cursor or Cowork is the agent that turns a brief into a layout. Brandiseer stores the logo and visual identity once, then applies that memory on every still. The prompt carries subject, layout, composition, and on-image text. It does not restate colours, fonts, mood, or visual style.

A Klaviyo programme drifts when every hero is a one-off export from a general image tool. Brandiseer keeps the still on the same brand as the rest of the campaign. Klaviyo still decides which template receives the file, and a person decides when that email is sent.

This is a different job from the sibling guides:

  • Slack creative desk is a request-and-return desk. A person writes a brief in Slack and an agent posts a still back in the thread.
  • Social media automation writes captions and schedules posts with Buffer.
  • Always-on creative automation is the HTTP step in Zapier, Make, or n8n.
  • Webflow site visuals generates site stills and hands imageUrl to Webflow.
  • HubSpot campaign creatives generates campaign stills and hands imageUrl to HubSpot.
  • This guide generates email heroes, headers, and promo stills and hands imageUrl to Klaviyo. Brandiseer does not push into Klaviyo and does not send campaigns.

Example strip: email hero, promo square, section background, and footer banner

Stack

LayerToolRole
Brand visualsBrandiseer MCP and/or REST v2Generate on-brand stills. MCP uses Authorization: Bearer. REST uses X-API-Key: bds_...
Agent host (pick one)CursorRead the email brief, call Brandiseer, return imageUrl and a placement note
Agent host (pick one)Claude CoworkSame contract as Cursor for interactive email stills
Email homeKlaviyoTemplate image blocks and the image library. A person places the still.

Stack diagram: Cursor or Cowork, Brandiseer, and Klaviyo

You only need one agent host. The Brandiseer contract is the same on both. Klaviyo has no Brandiseer app that drops a still into a template. The handoff is an image URL or a download. A person places it.

Brandiseer docs: Developers · guide/docs · guide/image · Settings → API

Klaviyo docs: Email template editor · Email image best practices · Background images · Dynamic images · Images API overview · Upload Image From URL · Upload Image From File

Klaviyo's API pages carry a revision date. The Upload Image From URL page fetched for this guide defaulted to 2026-07-15. Call the path on the page you open, and send the revision header that page shows. Do not invent a neighbouring revision or a template-write path.

Endpoint tables and HTTP contracts are in API reference at the end of this guide.

Klaviyo (placement, not generation)

Two practical paths. Use the first one unless you already have a private API key and only need the file in the library.

  1. Image block or image library (default). Download the file or copy imageUrl. In the template editor, drag an image block into the canvas. Klaviyo's editor lets you add the image from the Image Library, by uploading a JPEG, PNG, or GIF, by Import Image with an image URL, or as a Dynamic Image. The image library itself is Content > Images & brand > Images. Brandiseer stops at the URL. See the template editor and email image best practices.
  2. Images API (optional library import). When you already have a private key with images:write, import the public imageUrl with the call on Upload Image From URL. A 201 puts the image in the account library (hidden: false so it shows there). It does not place the image in a template, and it does not send a campaign. See Setup stage 6.

This guide does not create campaigns, assign templates to campaign messages, update drag-and-drop templates, or call send_campaign. A person places the still and sends later, outside this workflow.

A hero or header in this guide is a wide still in an image block at the top of the email, or a section background when text must sit on top of the picture. It is not the header/link bar block. That block is a logo plus navigation links. Klaviyo's editor article says Outlook can add a border to header/link bar elements, and suggests a logo image block plus a table when you need to avoid that. Do not drop a campaign hero into the header/link bar and call it placed.

How it works

Architecture, from email brief to a still sitting in a Klaviyo template:

  1. You store the brand once in Brandiseer (logo and reference visuals teach the look).
  2. The agent host (Cursor or Cowork) has Brandiseer MCP or REST, the Brand ID (bds_c_...), and the standing instructions in this guide.
  3. You name the slot: email hero or header, promo still, section background, or a short footer banner. The agent rewrites that brief into subject, layout, and on-image text, then sets aspectRatio, resolution, mode, and useLogo as fields.
  4. Brandiseer returns imageUrl. The agent reports the URL, the crop, the mode, a suggested alt text line, and a placement note (which template and which block). It does not claim the Klaviyo template changed.
  5. A person imports or uploads the file and assigns it in the template editor. They set alt text, the click link, and the display width. They leave the campaign unsent and the flow status unchanged. Optional API steps follow Klaviyo's Images API and stop at the library.

Workflow infographic: brief, Brandiseer still, imageUrl, Klaviyo library or Import Image, a person places the image

Connect the workflow

Give the agent access to Brandiseer

Create an API key for the runnable setup, or connect the hosted MCP endpoint when your agent supports MCP.

What you need

  • Company website URL, if the brand is not in Brandiseer yet
  • Brandiseer account with at least one finished brand profile
  • API key (bds_...) from Settings → API or Developers
  • Brand ID (bds_c_...) for every brand the agent may call
  • Credits for the stills you actually generate (see the table in Limits & FAQ)
  • Cursor or Claude Cowork, with Brandiseer MCP or a way to call REST
  • A Klaviyo account you can edit
  • Access to the email template editor (a draft campaign, a flow email, or Email Templates) and to Content > Images & brand > Images
  • Optional, only for the Images API: a Klaviyo private API key with the images:write scope, in the agent secret store. Requests use Authorization: Klaviyo-API-Key plus a revision header, as on Upload Image From URL. This key is not the Brandiseer key. Klaviyo's remote MCP is Owner, Admin, or Manager only. This guide does not require that MCP

Setup

Stage 1: Add your brand on Brandiseer

  1. Go to brandiseer.com. In the homepage input, enter your company website URL and click Try My Brand.
  2. Wait about one minute while Brandiseer analyses the site and picks a logo and visuals.
  3. Review those visuals carefully. They teach Brandiseer your look. Every later Klaviyo still is influenced by what you leave here.
  4. Remove anything off-brand (partner logos, stock, irrelevant screenshots). Add campaign creatives or product photography that match the look you want.
  5. Click Add Brand, sign up if prompted, then wait about 30 seconds for the brand profile to finish.

Agencies repeat this once per client. Do not point two Klaviyo accounts at one Brand ID.

Stage 2: API key and Brand ID

  1. Open brandiseer.com/developers or Settings → API.
  2. Create an API key (bds_...). Put it in the agent host's secret store. Do not paste it into a Klaviyo template, a campaign, Slack, or a git repo.
  3. Copy the Brand ID (bds_c_...).
  4. Confirm the key with GET https://brandiseer.com/api/v1/credits and GET https://brandiseer.com/api/v1/brands, header X-API-Key. The credits JSON includes credits. The brands list includes each brand id.
  5. Optional reachability check, no key required: GET https://brandiseer.com/api/v1/health returns { "status": "ok" }.

Read guide/docs and guide/image once while you write the standing instructions. Those pages are the live contract if a field name ever moves.

Stage 3: Connect Brandiseer to the agent host

Use Cursor or Cowork. One host is enough.

A. MCP

  1. Add the Brandiseer MCP server at https://brandiseer.com/api/mcp.
  2. Authenticate with Authorization: Bearer and the API key, in the secret field your host provides.
  3. Confirm the tool list shows brandiseer_list_brands, brandiseer_check_credits, and brandiseer_generate_image. If a fourth Brandiseer tool appears, ignore it until guide/docs documents it.

B. REST

  1. On Developers, open View Docs and use Copy for LLM if you want the reference inside the session.
  2. Tell the agent to prefer POST https://brandiseer.com/api/v2/generate or POST https://brandiseer.com/api/v2/generate/async with X-API-Key.
  3. If Design mode times out, switch that call to async and poll GET https://brandiseer.com/api/v2/jobs/:jobId every 3 to 5 seconds.

Stage 4: Save the standing instructions

  1. Paste the System prompt from this guide into the Cursor rule or Cowork instructions that will run email stills.
  2. Fill the defaults the prompt asks for: Brand ID, default crops per slot, resolution, mode, and whether useLogo is on when the brief is silent.
  3. Ask the agent to call brandiseer_list_brands (or GET /api/v1/brands) and confirm the Brand ID exists before the first paid still.

Stage 5: Smoke test a hero in an image block

  1. Ask for one email hero with a layout-only brief (the Spring hero in Example flows).
  2. Confirm the agent checked the brand, avoided colour and mood words, and returned imageUrl plus crop, mode, and a placement note.
  3. In Klaviyo, open a draft campaign or an unsent template. Drag an image block to the top of the canvas. Add the still by Import Image (paste imageUrl), by uploading the downloaded file, or by choosing it from the Image Library after you have uploaded it under Content > Images & brand > Images.
  4. Set alt text, a link address if the hero should be clickable, alignment, and width. Klaviyo recommends a 600px content width, full-width images about 600 to 1000px wide and under 2000px tall, and files around 1MB or smaller. The editor accepts up to 10MB. A large Brandiseer still can be inserted and then resized in the block. Klaviyo's own tip for crispness is to use a larger source and display it smaller.
  5. Use Preview & test. For a campaign or a list, segment, price-drop, or date-triggered flow, search a profile. For a metric-triggered flow, preview by the triggering event. Leave the campaign unsent. Do not change a flow's status.
  6. Send a second brief that only says "make the hero premium and moody". The agent should ask what is physically in the frame instead of generating.

If the hero must sit behind a Klaviyo text block and button, use a section background instead of baking the headline into the image. That path is in the next stage. Prefer the image block when inbox support matters: Klaviyo documents that Outlook for Windows does not support background images, and that Yahoo Mail and AOL have partial support.

Stage 6: Optional image library import (Images API)

Skip this stage if people will import or upload by hand. Use it only when a private key already exists and the still must appear in the library before someone opens the template.

  1. Create the key with the images:write scope. Authentication is documented on Upload Image From URL and the API overview: header Authorization: Klaviyo-API-Key <private-key>, header revision (use the default printed on the endpoint page; this guide saw 2026-07-15), and accept plus content-type of application/vnd.api+json. This is not the Brandiseer key.
  2. Generate the still in Brandiseer first. Klaviyo has to be able to fetch import_from_url. The same page limits that import to jpeg, png, and gif, and to 5MB. If imageUrl is not public, the file is larger than 5MB, or Klaviyo rejects the format, stop the API call. Download the file and upload it in the template editor instead (10MB there; JPEG, PNG, GIF, and WebP that Klaviyo converts to PNG, except animated WebP).
  3. Import with the documented call: POST https://a.klaviyo.com/api/images. Rate limits on that page: burst 3/s, steady 100/m, daily 100/d. Body:
Copy-ready
{
  "data": {
    "type": "image",
    "attributes": {
      "import_from_url": "https://...",
      "name": "spring-email-hero",
      "hidden": false
    }
  }
}

import_from_url is required. name defaults to the filename if you omit it. If the name already exists, Klaviyo adds a suffix. Keep hidden false so the file shows in the asset library. A data URI is also accepted on that page. Prefer the public imageUrl when it meets the 5MB and format rules.

  1. A 201 body includes data.id and data.attributes (name, image_url, format, size, hidden, updated_at). The links.self value looks like https://a.klaviyo.com/api/images/{id}/. Confirm with GET https://a.klaviyo.com/api/images (the overview's list example) using the same key and revision header. The Klaviyo-hosted image_url is what you then pick in the template. It is not yet inside an image block.
  2. If you already have the file on disk and the URL import failed, the file upload is POST https://a.klaviyo.com/api/image-upload with content-type: multipart/form-data, form fields file (required), optional name, and optional hidden. The overview's example uses the same Authorization and revision headers. Same 5MB jpeg, png, or gif limit. A person still places the file.
  3. Open the draft template, drag an image block, and choose the image from the Image Library. Do not send the campaign in the smoke test.

The editor's automatic compression review (compare original and compressed, or an upload setting of Compare, Use originals, or Use compressed) applies when a person uploads in the product. It is not part of the API body above. GIFs are not compressed by that tool.

Stage 7: Section background, when text must sit on the image

Skip this unless the brief needs Klaviyo text or buttons on top of the still. Klaviyo recommends this over a single image full of text, because recipients who block images, and people using screen readers, still get the text. Background images fail in some inboxes (see Limits & FAQ), so also set a section colour close to the image.

  1. Download the still. The background article does not describe an Import URL field. It says: open the section Styles tab, find Background, click +, then Browse Image Library and upload.
  2. Add a text block and, if you need one, a button, in that section. Leave those words out of the Brandiseer prompt. Tell the agent "empty region" instead.
  3. In Format, pick Original size, Fit, Fill, or Tile. Display on is Content or Section, which chooses whether the image stays in the content width or spans the section.
  4. Turn Section color on and pick a fallback colour. For a whole-template background, use the template Styles tab, click +, and choose a library image or upload. Set a template background colour as well. Full steps: background images.
  5. Preview. Do not send.

Prompting rules for Brandiseer images

When the agent builds prompt:

  • Keep subject, layout, composition, and on-image text (what the words say and where they sit).
  • Never send brand colours, fonts, mood, or visual style. Brand memory already applies those. Style words fight the brand and produce off-brand stills.
  • Put crop in aspectRatio, quality in mode, pixel size in resolution, and logo on/off in useLogo. Those are body fields, not prompt prose.
  • Map the Klaviyo slot to a documented ratio. Email hero, header, and section background: 16:9. Promo square: 1:1. A card-like block in the email: 4:3. A short footer banner: 16:9, then the person sets a shorter display height or crops a rectangle in the image block. Brandiseer does not offer a 600px-wide email ratio. Portrait 9:16 is a poor default inside a 600px column. Use it only when the brief explicitly asks for a tall still.
  • Prefer design for finished email stills. fast is the API default if you omit mode, and it is the right fallback if a design job fails once.
  • Prefer 1K or 2K. Klaviyo asks for files around 1MB, allows 10MB in the editor, and allows 5MB on the Images API. 4K is optional and easier to reject. PNG is the better editor choice when the still contains text. Klaviyo says PNG displays best across devices for images that contain text.
  • Set useLogo true only when the brief asked for a logo (or your default says so). Headlines that a Klaviyo text block will render should stay off the image. Say "empty region" for that area instead of describing a font.
  • Full rules: Prompt compatibility.

System prompt

Paste this into Cursor or Cowork as the standing instructions for Klaviyo email stills. Replace the placeholders before the first generate.

Copy-ready
You generate on-brand email heroes, headers, and promo stills for Klaviyo.
Brandiseer returns an image URL. You do not push pixels into Klaviyo, and
you do not send a campaign or change a flow.

Brandiseer:
- MCP: https://brandiseer.com/api/mcp with Authorization: Bearer.
  Tools you may call: brandiseer_list_brands, brandiseer_check_credits,
  brandiseer_generate_image. Do not invent tool names.
- REST: X-API-Key: bds_... (secret store only).
  Prefer POST https://brandiseer.com/api/v2/generate
  or POST https://brandiseer.com/api/v2/generate/async
  then poll GET https://brandiseer.com/api/v2/jobs/:jobId every 3 to 5 seconds
  until data.status is done or failed, or about 10 minutes have passed.
- Live contract: https://brandiseer.com/guide/docs and
  https://brandiseer.com/guide/image

Defaults for this account (fill in once):
- Brand ID: bds_c_...
- Email hero, header, and section background aspectRatio: 16:9
- Promo square aspectRatio: 1:1
- mode: design
- resolution: 2K (use 1K if a 5MB Klaviyo API import is in play)
- useLogo when the brief is silent: false
- Multi-brand map, if any: brand name to bds_c_...

On every request:
1. Resolve brandId from the brief or the default. If more than one brand
   exists and the brief does not name one, ask. Never fall through to
   another client's Brand ID.
2. Check credits before a batch (brandiseer_check_credits or
   GET https://brandiseer.com/api/v1/credits). A single still can proceed
   if the last known balance covers the mode and resolution in the table
   you were given. On 402, stop.
3. Rewrite the brief into subject, layout, composition, and on-image text.
   Strip colours, fonts, mood, and visual style. If stripping leaves no
   physical subject, ask what is in the frame. Do not generate.
4. Choose aspectRatio from the slot. Put resolution, mode, and useLogo in
   API fields, not in the prompt. Do not invent a 600px email ratio.
5. Generate one still. Return imageUrl, aspectRatio, mode, resolution,
   useLogo, a one-line alt text suggestion, and a placement note:
   image block (hero, header, promo, or footer) or section background.
6. Do not tell the user the Klaviyo template changed unless they confirm
   they placed the file. Do not send, schedule, or publish.

Klaviyo, only when the human already supplied a private key and asked
to import the file into the image library:
- Authorization: Klaviyo-API-Key, the private key. Never the Brandiseer key.
- revision header: copy it from
  https://developers.klaviyo.com/en/reference/upload_image_from_url
- POST https://a.klaviyo.com/api/images
  content-type application/vnd.api+json
  data.type = image
  data.attributes.import_from_url = the Brandiseer imageUrl
  data.attributes.hidden = false
- jpeg, png, or gif, maximum 5MB, scope images:write.
  If the file is larger or the format is rejected, tell the human to
  upload it in the template editor. Do not invent a workaround URL.
- A 201 means the library has the image. It does not mean an image
  block was filled. A person still places it.
- File upload, only if they already have the bytes:
  POST https://a.klaviyo.com/api/image-upload as multipart form file.
  Same size and format limits. Read the Upload Image From File page.
- Do not call campaign send, template update, or flow update tools.

Out of scope:
- Slack replies, Buffer scheduling, and Zapier, Make, or n8n scenarios.
- Webflow site placement and HubSpot files, pages, or ads.
- Legal approval of claims, prices, or offers printed on the image.
- GET https://brandiseer.com/api/v1/usage (browser session only).

Prompt rewriter

Use this when a brief arrives as messy notes. It does not call Brandiseer. It only cleans text before you put it in prompt. The word list is a starting filter, not an official dictionary. If a phrase still describes colour, type, mood, or look, delete it by hand.

Copy-ready
// Local rewriter for a Cursor or Cowork helper script.
// Keeps subject, layout, composition, and on-image text.
// Strips colour, type, mood, and visual-style language.

const STYLE_WORDS =
  /\b(colou?rs?|palette|hex|fonts?|typefaces?|typography|serif|sans-serif|moods?|vibes?|aesthetics?|minimalist|luxury|playful|cinematic|pastel|neon|gradients?|moody|elegant|premium|on-brand)\b/gi;

const SLOT_TO_RATIO = {
  hero: "16:9",
  header: "16:9",
  banner: "16:9",
  footer: "16:9",
  section: "16:9",
  background: "16:9",
  "16:9": "16:9",
  promo: "1:1",
  square: "1:1",
  "1:1": "1:1",
  card: "4:3",
  "4:3": "4:3",
  portrait: "9:16",
  "9:16": "9:16",
};

function rewriteBrandiseerPrompt(input) {
  const headline = String(input.headline || "").trim();
  const subject = String(input.subject || input.brief || "").trim();
  const slotKey = String(input.slot || input.crop || "").trim().toLowerCase();
  const aspectRatio = SLOT_TO_RATIO[slotKey] || "";

  let prompt = [subject, headline ? `On-image text: "${headline}".` : ""]
    .filter(Boolean)
    .join(" ");

  prompt = prompt
    .replace(/#[0-9a-f]{3,8}\b/gi, " ")
    .replace(STYLE_WORDS, " ")
    .replace(/\s+/g, " ")
    .trim();

  return {
    prompt,
    aspectRatio,
    needsSubject: prompt.length < 12 || !aspectRatio,
  };
}

If needsSubject is true, ask the human for a subject and a slot. Do not POST.

Add-ons

Add these after the hero smoke test passes. They do not change Brandiseer's image contract, and they do not give Brandiseer a send button.

Approval before send

After imageUrl is in the image block or on the section, a named reviewer uses Preview & test. Only then may someone schedule or send, in Klaviyo, as a separate step. Until that happens, leave the campaign as a draft and leave flow emails unreleased. Brandiseer does not approve legal claims, prices, or offers.

One brand per Klaviyo account

Keep a table: Klaviyo account name, private-key secret name (only if you use stage 6), and bds_c_.... Require an account name on every brief when more than one account exists. If the name misses, stop and list the accounts you configured. Confirm Brand IDs with GET /api/v1/brands. Never fall through to another client's Brand ID or another account's key.

Credit soft-limit

When credits is under a threshold you choose (for example 40), switch new email stills to mode: fast and resolution: 1K, or skip them. Fast at 1K costs 4 credits. An explicit "run anyway" from the human can override the skip. The threshold is yours, not a Brandiseer default.

Placement log

Keep a short note next to the work: campaign or flow name, template, slot, brandId, mode, aspectRatio, resolution, imageUrl, and whether it was imported into an image block or uploaded for a section background. Brandiseer does not write this log. Klaviyo does not send it back to Brandiseer.

Reuse the block

When the hero image block looks right, a person can save that block or section with the star icon in the template editor. Klaviyo calls this universal content. Later templates can insert it from the Universal tab. Edits can be applied to every copy. That save is a Klaviyo editor action. Brandiseer does not sync it. See the universal content section of the template editor guide.

Dynamic image (not the default still)

A Brandiseer imageUrl is one still for this send. Klaviyo's Dynamic Image option is a different feature: a personalisation tag from profile or event data, pasted into Select image > Dynamic Image. Use it only when that variable already exists. The help article shows filters such as {{ event.image_url|missing_product_image }} and a default filter with your own backup URL. Read How to insert a dynamic image before you paste a tag. This guide does not write profile properties and does not invent event paths.

Handoff to the sibling guides

Do not embed Buffer, a Slack desk, an always-on scenario, Webflow, or HubSpot inside this Klaviyo guide.

Optional motion (not the email MVP)

Most inboxes strip embedded video. Klaviyo's video block does not play inside the email. You paste a YouTube, Vimeo, TikTok, or other hosted video URL, and a click opens a new tab. YouTube can supply a thumbnail. Other hosts need a thumbnail you upload. That thumbnail can be a Brandiseer still. The video URL is yours.

Brandiseer video is a separate contract. Generate the still first, then send its public imageUrl to POST https://brandiseer.com/api/v2.1/video/generate. Poll GET https://brandiseer.com/api/v2.1/video/jobs/:jobId. Video jobs use status completed and a videoUrl, which is different from image jobs (done and imageUrl). Read guide/video for tier, duration, and resolution before you enable this. Video credits are per second and are not the still table below. A video failure does not undo the still. Leave this off unless the brief explicitly asks to animate, and still do not send the campaign from this guide.

Limits & FAQ

Does Brandiseer update Klaviyo templates or send campaigns?

No. Brandiseer returns imageUrl. A person imports that URL into an image block, uploads the file, or picks it from the image library, then sets alt text and width. A library import through the Images API only stores the file. It does not assign a block. Sending and flow changes stay in Klaviyo, after a person reviews the draft.

Is there a Brandiseer app inside Klaviyo?

No. There is no Brandiseer block in the template editor in this guide. Do not look for a native "send to Klaviyo" button on the Brandiseer side.

What if Klaviyo rejects the image?

The template editor supports JPEG, PNG, and GIF, and can convert a non-animated WebP to PNG. Editor uploads are capped at 10MB. Klaviyo recommends about 1MB or smaller, 72dpi, full-width images about 600 to 1000px wide and under 2000px tall, because large files load slowly. The Images API import and file upload are stricter: jpeg, png, or gif, maximum 5MB. If the API returns an error, or the file is over 5MB, download the still and upload it in the editor. Crop inside the image block if you need a circle, square, or custom rectangle. Klaviyo keeps the full image, so the crop can be changed later.

Which Klaviyo calls are in this guide?

Only calls confirmed on Klaviyo's public docs, and only at the level those pages describe:

  • Human placement: image block sources (Image Library, Upload Image, Import Image, Dynamic Image) on the template editor guide, file types and the 10MB cap on email images, library path Content > Images & brand > Images on that same article, and section or template backgrounds on background images.
  • Optional library import: POST https://a.klaviyo.com/api/images on Upload Image From URL, scope images:write, revision header, 5MB, jpeg/png/gif.
  • Optional file upload: POST https://a.klaviyo.com/api/image-upload on Upload Image From File and the Images API overview.
  • Optional read-back: GET https://a.klaviyo.com/api/images, and the self link the create response returns.

This guide does not document a "set the hero block" endpoint. It does not call campaign send.

Can I use Klaviyo's own MCP?

Klaviyo documents a remote MCP server at https://mcp.klaviyo.com/mcp for Owner, Admin, or Manager roles. See Klaviyo MCP server. This guide does not connect it and does not depend on it. That page lists many tools, including upload_image_from_url (remote) and upload_image_from_file (not marked available on the remote server), plus template writers and send_campaign. Do not use those send or template tools for this workflow. If upload_image_from_url is actually exposed in your client, it is still only a library import. A person places the image block. Do not assume a tool fills a hero.

Where do the keys live?

The Brandiseer key (bds_...) and any Klaviyo private key live in the agent host's secret store. Never in a template, a campaign preview, a Slack message, a prompt you commit, or a workflow export in git. Rotate either key if it leaks. Poll a Brandiseer job with the same Brandiseer key that submitted it. Call Klaviyo with the Klaviyo key.

What do stills cost?

Credits per still. Failures refund. Async submits deduct immediately and refund if the job fails.

Mode1K2K4K
Fast468
Design568
Pro6810

402 means not enough credits. Pricing context: brandiseer.com/pricing.

Klaviyo's URL and file upload endpoints add their own cap: 100 uploads a day on the pages fetched for this guide, plus burst 3/s and steady 100/m. Hand uploads in the editor are not that API counter. If you are importing a large batch through the API, stay under the daily cap or switch the rest to the editor.

Why is the still off-brand?

Almost always because the prompt contained colours, fonts, mood, or visual style. Strip them and generate again. See guide/image.

Why does the crop look wrong in the email?

Brandiseer aspect ratios are 1:1, 16:9, 9:16, and 4:3. Klaviyo emails are usually about 600px wide. Generate the hero at 16:9, import it, then set the image block width and, if needed, crop a rectangle in the editor. Do not ask Brandiseer for a custom pixel size inside the prompt.

Why did the background disappear in Outlook?

Klaviyo documents that Outlook for Windows does not support background images, and that Yahoo Mail and AOL have partial support. The section or template background colour shows instead. Put the offer in a text block, or place the still in an image block when that inbox matters.

How long can I poll?

About 10 minutes, then the Brandiseer job expires. Poll every 3 to 5 seconds. Stop on done or failed as well. Do not start a second job for the same slot while the first is still open, or you will pay twice.

Which generate URL should new email work use?

POST /api/v2/generate when the agent host waits long enough. POST /api/v2/generate/async when it does not. Legacy POST /api/v1/generate remains for older callers and only supports Fast and Pro via proMode boolean.

Does the agent approve claims on the image?

No. If the still has a price, a discount, or a legal line, a person reads it before send. Brandiseer does not review the claim.

Does deleting the library file remove it from the email?

Klaviyo's image article says deleting an image from Content > Images & brand > Images does not remove it from templates that already use it. Do not treat a library delete as an unsend.

Demo / motion

Motion brief only. This is not an embed, and there is no walkthrough URL yet.

Working title: Klaviyo email heroes Length: 45 to 75 seconds

Story beats:

  1. A person asks Cursor or Cowork for an email hero with a layout-only brief
  2. The agent calls Brandiseer (MCP or REST v2) and shows an on-brand still
  3. imageUrl is imported into a Klaviyo image block on a draft template
  4. Optional cut: the same file is uploaded as a section background, with a text block and button on top, still unsent
  5. A human previews and leaves send for a later step

On screen: the agent transcript with the prompt (no colour or mood words), one finished still, and the Klaviyo image block settings (alt text and width). Blur the Brandiseer API key and any Klaviyo private key. Do not show a sent campaign, and do not show a fake video player in the guide.

Example flows

Flow A: Email hero, placed in an image block

The brief: "Email hero for the spring drop. Product on the left. Leave the right half empty. The heading will be a Klaviyo text block, not text on the image. No logo."

The agent selects the default brandId, sets aspectRatio to 16:9, mode to design, resolution to 2K, and useLogo to false, and returns imageUrl plus alt text such as "Spring kit product, left side of the hero". You open a draft campaign, drag an image block, choose Import Image, paste the URL, set alt text and width, and preview. You send later, after the heading and spacing look right.

Flow B: Promo square

The brief: "Promo square for the same campaign. One product, centred. On-image text 20% off along the bottom. No logo."

The agent uses 1:1 and returns a second imageUrl. You add another image block under the hero. Two Design 2K stills cost 12 credits if both succeed. Failures refund.

Flow C: Section background with live text

The brief: "Offer band background. Products along the bottom. Keep the top empty for a heading and a button I will add in Klaviyo. No words on the image."

The agent keeps on-image text out of the prompt. You download the file, open the section Styles tab, add the background from the image library, set a fallback section colour, then add a text block and a button. You tell the reviewer that Outlook for Windows will show the colour, not the picture.

Flow D: Credit check before a campaign set

Before Flow A and Flow B together, the agent calls brandiseer_check_credits or GET https://brandiseer.com/api/v1/credits and reads credits. Two Design 2K stills need 12 credits. If the balance is lower, it stops or switches the batch to fast at 1K (4 credits each) only if you asked for that fallback. GET /api/v1/usage is a browser session endpoint. Do not call it from the agent.

Flow E: Style-only brief

The brief: "Make the hero feel premium and moody."

The agent does not generate. It asks which email, what is physically in the frame, whether any words must appear on the image, and whether the logo is on. Colour, font, and mood stay out of the prompt.

Flow F: Header bar is not the hero

The brief: "Put this in the header bar."

The agent does not treat the header/link bar block as the hero slot. It says that block is a logo and links, and it returns a 16:9 still for an image block at the top of the template unless you confirm you only wanted a small logo (useLogo: true, and a tighter crop you name).

Related use cases

Links

ResourceURL
Brandiseerhttps://brandiseer.com
Developershttps://brandiseer.com/developers
API reference (guide/docs)https://brandiseer.com/guide/docs
Image prompt compatibilityhttps://brandiseer.com/guide/image
Video prompting (optional motion)https://brandiseer.com/guide/video
MCP endpoint (agent hosts)https://brandiseer.com/api/mcp
API keyshttps://brandiseer.com/settings/api
Pricing / creditshttps://brandiseer.com/pricing
Klaviyohttps://www.klaviyo.com
Klaviyo template editorhttps://help.klaviyo.com/hc/en-us/articles/4407911841435
Klaviyo email imageshttps://help.klaviyo.com/hc/en-us/articles/115005253688
Klaviyo background imageshttps://help.klaviyo.com/hc/en-us/articles/115005255968
Klaviyo dynamic imageshttps://help.klaviyo.com/hc/en-us/articles/4408810769307
Klaviyo Images API overviewhttps://developers.klaviyo.com/en/reference/images_api_overview
Klaviyo upload image from URLhttps://developers.klaviyo.com/en/reference/upload_image_from_url
Klaviyo upload image from filehttps://developers.klaviyo.com/en/reference/upload_image_from_file
Klaviyo API overviewhttps://developers.klaviyo.com/en/reference/api-overview
Klaviyo MCP serverhttps://developers.klaviyo.com/en/docs/klaviyo_mcp_server
Visual pack manifestassets/MANIFEST.md
Sibling: HubSpot campaign creativeshttps://blog.brandiseer.com/use-cases/hubspot-campaign-creatives
Sibling: Webflow site visualshttps://blog.brandiseer.com/use-cases/webflow-site-visuals
Sibling: Always-on creative automationhttps://blog.brandiseer.com/use-cases/always-on-creative-automation
Sibling: Slack creative deskhttps://blog.brandiseer.com/use-cases/slack-creative-desk
Sibling: Social media automationhttps://blog.brandiseer.com/use-cases/social-media-automation

Source

Public Use case README for Klaviyo email heroes. Brandiseer MCP and REST v2 image generation from Cursor or Claude Cowork, then a person places imageUrl in a Klaviyo template image block or the image library. Aligned with guide/docs and guide/image (23 September 2026). Klaviyo placement steps follow the public help centre and Images API pages linked above. Brandiseer does not push into Klaviyo and does not send campaigns. Distinct from Slack creative desk, Buffer social scheduling, Zapier, Make, or n8n always-on HTTP, Webflow site visuals, and HubSpot campaign creatives.

API reference

Wiring reference for agents and HTTP modules. The sections above are the human path.

MCP (interactive stills in Cursor or Cowork)

Connect https://brandiseer.com/api/mcp with Authorization: Bearer and the API key. The only Brandiseer tools this guide uses are:

  • brandiseer_list_brands
  • brandiseer_check_credits
  • brandiseer_generate_image

Do not invent extra Brandiseer tool names. If the host needs explicit mode, aspectRatio, or async polling, use REST v2 below. Brandiseer MCP does not edit Klaviyo.

REST (prefer v2 images)

Send X-API-Key: bds_... on every authenticated Brandiseer call. There is no official SDK. Any HTTP client the agent host can run is enough.

CallWhat you get
POST https://brandiseer.com/api/v2/generateSync still. 200 body { "imageUrl", "creditsUsed" }. Design mode often takes 40 to 70 seconds.
POST https://brandiseer.com/api/v2/generate/async202 body { "data": { "jobId" } } (ids look like bds_job_...). Credits are deducted when you submit.
GET https://brandiseer.com/api/v2/jobs/:jobIdPoll every 3 to 5 seconds with the same API key. data.status becomes done or failed. Jobs expire after about 10 minutes. Failures refund credits.
POST https://brandiseer.com/api/v1/generateLegacy only. proMode boolean. Fast and Pro only. Prefer v2.
GET https://brandiseer.com/api/v1/creditsJSON includes credits, the current balance for that key.
GET https://brandiseer.com/api/v1/brandsBrands for the key. Each brand id looks like bds_c_....
GET https://brandiseer.com/api/v1/health{ "status": "ok" }. No API key.

Image body fields: brandId, prompt, optional aspectRatio (1:1, 16:9, 9:16, 4:3), resolution (1K, 2K, 4K), mode (fast, design, or pro; default fast if you omit it), useLogo.

Sync status codes you should branch on: 200 success, 400 bad body, 401 bad key, 402 not enough credits, 404 brand not found, 500 server error.

Done job body: { "data": { "status": "done", "imageUrl", "creditsUsed", "referenceImage" } }. Hand data.imageUrl to the person placing it in Klaviyo. Failed job body: { "data": { "status": "failed", "error": { "code", "message" } } }.

Cursor and Cowork can wait on a sync Design call when the session allows it. If the HTTP client times out under about 60 seconds, use async and poll. Do not point Klaviyo at the Brandiseer MCP URL.

Field mapping

Incoming fieldAPIRule
Slot (hero, header, promo, section, footer)aspectRatioHero, header, section, footer: 16:9. Promo square: 1:1. In-email card: 4:3. Portrait only if the brief asks: 9:16.
headlineinside prompt onlyOn-image text and placement. Not a separate body field. Leave it out when a Klaviyo text block will set the headline.
brandIdbrandIdbds_c_.... Required.
modemodefast, design, or pro. Omit and the API uses fast. Prefer design for email stills.
useLogouseLogotrue or false.
subject or briefpromptAfter the rewriter. If the cleaned text has no subject, do not call Brandiseer.
resolutionresolution1K, 2K, or 4K. Prefer 2K or 1K when Klaviyo's 5MB API limit or 1MB inbox guidance applies.

Example JSON

Use this body for both sync and async. Only the URL and the response change.

Copy-ready
{
  "brandId": "bds_c_...",
  "prompt": "Wide email hero. Product centred on the left third. Empty right half for a headline the email will set in a Klaviyo text block. No on-image text.",
  "aspectRatio": "16:9",
  "resolution": "2K",
  "mode": "design",
  "useLogo": false
}

Sync: POST https://brandiseer.com/api/v2/generate. A Design 2K still costs 6 credits, so a success body looks like:

Copy-ready
{
  "imageUrl": "https://...",
  "creditsUsed": 6
}

Async: POST https://brandiseer.com/api/v2/generate/async. HTTP 202:

Copy-ready
{
  "data": {
    "jobId": "bds_job_..."
  }
}

Poll GET https://brandiseer.com/api/v2/jobs/bds_job_... with the same X-API-Key. When it finishes:

Copy-ready
{
  "data": {
    "status": "done",
    "imageUrl": "https://...",
    "creditsUsed": 6,
    "referenceImage": null
  }
}

When it fails (credits are refunded):

Copy-ready
{
  "data": {
    "status": "failed",
    "error": {
      "code": "...",
      "message": "..."
    }
  }
}

Ignore referenceImage for delivery. Klaviyo gets imageUrl (or a file you downloaded from it), pasted or uploaded by a person.

Slot prompts that stay layout-only:

SlotaspectRatioPrompt
Email hero or header16:9Wide email hero. Product centred on the left third. Empty right half for a headline the email will set in a Klaviyo text block. No on-image text.
Promo square1:1Square promo. Single product in the centre. On-image text: "20% off" along the bottom edge. Open space above the product.
Section background16:9Section background. Product cluster along the bottom edge. Upper two thirds empty for a Klaviyo heading and button. No on-image text.
Footer banner16:9Short landscape banner. Product left of centre. On-image text: "Spring kits" in the right third.

Run it with your brand

Connect the workflow to brand memory.

Save your visual identity in Brandiseer, then use MCP or the API to generate from the same brand across every supported workflow.