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.
- BrandiseerBrand memory and on-brand stills via MCP or REST
- KlaviyoTemplate image blocks and the image library. A person places the still.
- CursorAgent host for Brandiseer MCP or REST
- Claude CoworkAgent host for Brandiseer MCP or REST
Brandiseer + Klaviyo (+ Cursor or Claude Cowork)

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
imageUrlinto 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
imageUrlto Webflow. - HubSpot campaign creatives generates campaign stills and hands
imageUrlto HubSpot. - This guide generates email heroes, headers, and promo stills and hands
imageUrlto Klaviyo. Brandiseer does not push into Klaviyo and does not send campaigns.

Stack
| Layer | Tool | Role |
|---|---|---|
| Brand visuals | Brandiseer MCP and/or REST v2 | Generate on-brand stills. MCP uses Authorization: Bearer. REST uses X-API-Key: bds_... |
| Agent host (pick one) | Cursor | Read the email brief, call Brandiseer, return imageUrl and a placement note |
| Agent host (pick one) | Claude Cowork | Same contract as Cursor for interactive email stills |
| Email home | Klaviyo | Template image blocks and the image library. A person places the still. |

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.
- 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. - Images API (optional library import). When you already have a private key with
images:write, import the publicimageUrlwith the call on Upload Image From URL. A201puts the image in the account library (hidden: falseso 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:
- You store the brand once in Brandiseer (logo and reference visuals teach the look).
- The agent host (Cursor or Cowork) has Brandiseer MCP or REST, the Brand ID (
bds_c_...), and the standing instructions in this guide. - 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, anduseLogoas fields. - 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. - 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.

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:writescope, in the agent secret store. Requests useAuthorization: Klaviyo-API-Keyplus arevisionheader, 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
- Go to brandiseer.com. In the homepage input, enter your company website URL and click Try My Brand.
- Wait about one minute while Brandiseer analyses the site and picks a logo and visuals.
- Review those visuals carefully. They teach Brandiseer your look. Every later Klaviyo still is influenced by what you leave here.
- Remove anything off-brand (partner logos, stock, irrelevant screenshots). Add campaign creatives or product photography that match the look you want.
- 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
- Open brandiseer.com/developers or Settings → API.
- 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. - Copy the Brand ID (
bds_c_...). - Confirm the key with
GET https://brandiseer.com/api/v1/creditsandGET https://brandiseer.com/api/v1/brands, headerX-API-Key. The credits JSON includescredits. The brands list includes each brandid. - Optional reachability check, no key required:
GET https://brandiseer.com/api/v1/healthreturns{ "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
- Add the Brandiseer MCP server at
https://brandiseer.com/api/mcp. - Authenticate with
Authorization: Bearerand the API key, in the secret field your host provides. - Confirm the tool list shows
brandiseer_list_brands,brandiseer_check_credits, andbrandiseer_generate_image. If a fourth Brandiseer tool appears, ignore it until guide/docs documents it.
B. REST
- On Developers, open View Docs and use Copy for LLM if you want the reference inside the session.
- Tell the agent to prefer
POST https://brandiseer.com/api/v2/generateorPOST https://brandiseer.com/api/v2/generate/asyncwithX-API-Key. - If Design mode times out, switch that call to async and poll
GET https://brandiseer.com/api/v2/jobs/:jobIdevery 3 to 5 seconds.
Stage 4: Save the standing instructions
- Paste the System prompt from this guide into the Cursor rule or Cowork instructions that will run email stills.
- Fill the defaults the prompt asks for: Brand ID, default crops per slot, resolution, mode, and whether
useLogois on when the brief is silent. - Ask the agent to call
brandiseer_list_brands(orGET /api/v1/brands) and confirm the Brand ID exists before the first paid still.
Stage 5: Smoke test a hero in an image block
- Ask for one email hero with a layout-only brief (the Spring hero in Example flows).
- Confirm the agent checked the brand, avoided colour and mood words, and returned
imageUrlplus crop, mode, and a placement note. - 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. - 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.
- 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.
- 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.
- Create the key with the
images:writescope. Authentication is documented on Upload Image From URL and the API overview: headerAuthorization: Klaviyo-API-Key <private-key>, headerrevision(use the default printed on the endpoint page; this guide saw2026-07-15), andacceptpluscontent-typeofapplication/vnd.api+json. This is not the Brandiseer key. - 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. IfimageUrlis 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). - Import with the documented call:
POST https://a.klaviyo.com/api/images. Rate limits on that page: burst3/s, steady100/m, daily100/d. Body:
{
"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.
- A
201body includesdata.idanddata.attributes(name,image_url,format,size,hidden,updated_at). Thelinks.selfvalue looks likehttps://a.klaviyo.com/api/images/{id}/. Confirm withGET https://a.klaviyo.com/api/images(the overview's list example) using the same key andrevisionheader. The Klaviyo-hostedimage_urlis what you then pick in the template. It is not yet inside an image block. - If you already have the file on disk and the URL import failed, the file upload is
POST https://a.klaviyo.com/api/image-uploadwithcontent-type: multipart/form-data, form fieldsfile(required), optionalname, and optionalhidden. The overview's example uses the sameAuthorizationandrevisionheaders. Same 5MB jpeg, png, or gif limit. A person still places the file. - 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.
- 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.
- 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.
- 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.
- 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.
- 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 inmode, pixel size inresolution, and logo on/off inuseLogo. 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. Portrait9:16is a poor default inside a 600px column. Use it only when the brief explicitly asks for a tall still. - Prefer
designfor finished email stills.fastis the API default if you omitmode, and it is the right fallback if a design job fails once. - Prefer
1Kor2K. Klaviyo asks for files around 1MB, allows 10MB in the editor, and allows 5MB on the Images API.4Kis 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
useLogotrue 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.
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.
// 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
- Stills requested in Slack, returned in a thread: Slack creative desk.
- Captions and a Buffer schedule: Social media automation.
- A Zapier, Make, or n8n trigger that should deliver
imageUrlon a schedule: Always-on creative automation. - A homepage hero that lives in Webflow: Webflow site visuals.
- An email header, landing page, or ad that lives in HubSpot: HubSpot campaign creatives.
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/imageson Upload Image From URL, scopeimages:write,revisionheader, 5MB, jpeg/png/gif. - Optional file upload:
POST https://a.klaviyo.com/api/image-uploadon Upload Image From File and the Images API overview. - Optional read-back:
GET https://a.klaviyo.com/api/images, and theselflink 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.
| Mode | 1K | 2K | 4K |
|---|---|---|---|
| Fast | 4 | 6 | 8 |
| Design | 5 | 6 | 8 |
| Pro | 6 | 8 | 10 |
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:
- A person asks Cursor or Cowork for an email hero with a layout-only brief
- The agent calls Brandiseer (MCP or REST v2) and shows an on-brand still
imageUrlis imported into a Klaviyo image block on a draft template- Optional cut: the same file is uploaded as a section background, with a text block and button on top, still unsent
- 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
- HubSpot campaign creatives: on-brand stills placed in HubSpot emails, landing pages, and ads
- Webflow site visuals: on-brand stills placed in Webflow Assets or CMS image fields
- Always-on creative automation: Zapier, Make, or n8n calls Brandiseer REST and delivers
imageUrldownstream - Slack creative desk: people request stills in Slack and get them back in-thread
- Social media automation: on-brand images, captions, and Buffer scheduling
Links
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_brandsbrandiseer_check_creditsbrandiseer_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.
| Call | What you get |
|---|---|
POST https://brandiseer.com/api/v2/generate | Sync still. 200 body { "imageUrl", "creditsUsed" }. Design mode often takes 40 to 70 seconds. |
POST https://brandiseer.com/api/v2/generate/async | 202 body { "data": { "jobId" } } (ids look like bds_job_...). Credits are deducted when you submit. |
GET https://brandiseer.com/api/v2/jobs/:jobId | Poll 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/generate | Legacy only. proMode boolean. Fast and Pro only. Prefer v2. |
GET https://brandiseer.com/api/v1/credits | JSON includes credits, the current balance for that key. |
GET https://brandiseer.com/api/v1/brands | Brands 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 field | API | Rule |
|---|---|---|
| Slot (hero, header, promo, section, footer) | aspectRatio | Hero, header, section, footer: 16:9. Promo square: 1:1. In-email card: 4:3. Portrait only if the brief asks: 9:16. |
| headline | inside prompt only | On-image text and placement. Not a separate body field. Leave it out when a Klaviyo text block will set the headline. |
| brandId | brandId | bds_c_.... Required. |
| mode | mode | fast, design, or pro. Omit and the API uses fast. Prefer design for email stills. |
| useLogo | useLogo | true or false. |
| subject or brief | prompt | After the rewriter. If the cleaned text has no subject, do not call Brandiseer. |
| resolution | resolution | 1K, 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.
{
"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:
{
"imageUrl": "https://...",
"creditsUsed": 6
}
Async: POST https://brandiseer.com/api/v2/generate/async. HTTP 202:
{
"data": {
"jobId": "bds_job_..."
}
}
Poll GET https://brandiseer.com/api/v2/jobs/bds_job_... with the same X-API-Key. When it finishes:
{
"data": {
"status": "done",
"imageUrl": "https://...",
"creditsUsed": 6,
"referenceImage": null
}
}
When it fails (credits are refunded):
{
"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:
| Slot | aspectRatio | Prompt |
|---|---|---|
| Email hero or header | 16:9 | 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. |
| Promo square | 1:1 | Square promo. Single product in the centre. On-image text: "20% off" along the bottom edge. Open space above the product. |
| Section background | 16:9 | Section background. Product cluster along the bottom edge. Upper two thirds empty for a Klaviyo heading and button. No on-image text. |
| Footer banner | 16:9 | Short 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.
