HubSpot campaign creatives
An agent generates on-brand email headers, landing-page heroes, ad stills, and campaign thumbnails with Brandiseer; a person then places those image URLs in HubSpot.
- BrandiseerBrand memory and on-brand stills via MCP or REST
- HubSpotFile Manager, marketing emails, landing pages, and ads placement
- CursorAgent host for Brandiseer MCP or REST
- Claude CoworkAgent host for Brandiseer MCP or REST
Brandiseer + HubSpot (+ Cursor or Claude Cowork)

By the end of this guide you will have a repeatable way to make on-brand stills for HubSpot campaigns. An agent in Cursor or Claude Cowork calls Brandiseer, gets an imageUrl for an email header, a landing-page hero, a campaign thumbnail, or an ad still, and a person places that file in HubSpot.
Brandiseer owns the brand memory and the still. HubSpot owns the email, the landing page, and the ad. Brandiseer does not open HubSpot, does not upload into the files tool by itself, and does not send the email or publish the page or ad. A person downloads the file or copies imageUrl, uploads it in the files tool (or pastes a file URL in the image picker), and assigns it to an image module, a landing page, or an ad. Optional Files API and HubDB writes are documented only where HubSpot's own developer pages describe them.
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. This guide does not recreate any of those.
Who it's for
- Marketing teams who send HubSpot marketing emails, publish HubSpot landing pages, or build Facebook or LinkedIn ads in HubSpot, and need a header, hero, thumbnail, or ad still without opening a separate design tool for every campaign
- Agencies that keep one Brandiseer Brand ID per client and one HubSpot account (or portal) per client
- Operators who can copy an
imageUrlinto HubSpot's files tool, or who already have a HubSpot token and want a Files API import or a HubDB image cell filled from that URL
Ideal customer profile: a team whose campaigns already live in HubSpot, whose brand already lives in Brandiseer, and whose missing piece is a brand-safe still plus a clear handoff into the files tool.
Why Brandiseer in this stack
HubSpot is where the email, landing page, and ad are built. Cursor or Cowork is the agent that turns a campaign 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 HubSpot campaign drifts when every header is a one-off export from a general image tool. Brandiseer keeps the still on the same brand as the rest of the campaign. HubSpot still decides which module, page, or ad receives the file, and when that content is sent or published.
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. - This guide generates campaign stills and hands
imageUrlto HubSpot. Brandiseer does not push into HubSpot by itself.

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 campaign brief, call Brandiseer, return imageUrl and a placement note |
| Agent host (pick one) | Claude Cowork | Same contract as Cursor for interactive campaign stills |
| Campaign home | HubSpot | Files tool, marketing email image modules, landing pages, and the ads tool |

You only need one agent host. The Brandiseer contract is the same on both. HubSpot has no Brandiseer app that drops a still into an email. The handoff is an image URL, a download, or a HubSpot API call you perform by following HubSpot's docs.
Brandiseer docs: Developers · guide/docs · guide/image · Settings → API
HubSpot docs: Files API · Import from URL · Files tool · Upload files · Use images in content · File types and sizes · HubDB · Facebook ads in HubSpot · LinkedIn ads in HubSpot
HubSpot's overview articles sometimes still print an older date segment such as 2026-03. The endpoint pages used below are the 2026-09 pages fetched for this guide. Call the path on the page you open. Do not invent a neighbouring version.
Endpoint tables and HTTP contracts are in API reference at the end of this guide.
HubSpot (placement, not generation)
Three practical paths. Use the first one until a files import or a HubDB cell is actually needed.
- Files tool, then the editor (default). Download the file or copy
imageUrl. In HubSpot, open Content > Files and click Upload files, or drag the file into a folder. You need Super Admin or Edit permission for files. Then open the marketing email, landing page, or ad and select that file. The image picker can also add an image from your computer or via a file URL. Brandiseer stops at the URL. See Upload files and Use images in HubSpot content. - Files API (optional). When you already have a HubSpot token with the files scopes on the Files API guide, upload the bytes or import the public
imageUrl. A successful upload puts the file in the files tool. It does not assign the file to an email module, a landing-page hero, or an ad. See Setup stage 6. - HubDB image column (optional). When a landing page already reads an
IMAGEcolumn, update the draft row through the HubDB API HubSpot documents. That updates table data. It does not send an email, and publishing the table is a separate call that HubSpot says updates website pages using the table. See Setup stage 7.
This guide does not update marketing email HTML or email modules through the marketing emails API. A person places the still in the email editor.
How it works
Architecture, from campaign brief to a still sitting in HubSpot:
- 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 header, landing-page hero, campaign thumbnail, or ad still. 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, and a one-line placement note (which HubSpot email, page, or ad it is for). It does not claim the email or page changed. - A person uploads the file in the files tool and places it in an image module, a landing page, or an ad. Optional API steps follow HubSpot's docs and stop before send or publish.

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 HubSpot account you can edit
- Access to Content > Files, plus the marketing email, landing page, or ads tool you will place the still in
- Optional, only for Files API or HubDB: a HubSpot private-app or OAuth token in the agent secret store. Files upload and import need the
filesorfiles.writescopes listed on those endpoint pages. HubDB draft row updates needhubdb-data-write(the update page also listshubdb-data-append). Publishing a HubDB table needshubdb-publish. This token is not the Brandiseer key - Optional: the HubDB table id or name, the row id, and the real image column name. Read them from HubSpot. Do not guess column names
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 HubSpot 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 client portals 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 HubSpot property, an email, 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 campaign 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 header in the files tool
- Ask for one email header with a layout-only brief (the Spring header in Example flows).
- Confirm the agent checked the brand, avoided colour and mood words, and returned
imageUrlplus crop and mode. - In HubSpot, go to Content > Files and upload the file, or open a draft marketing email, click the image module, choose Replace, and add the image from your computer or via the file URL. Drag-and-drop emails place images in an image module. HubSpot's article says text modules and custom rich text modules in the drag-and-drop email editor cannot contain images. Classic-editor rich text uses the image icon on the toolbar. Marketing emails accept
.png,.ico,.bmp,.jpg, and.gif. - Leave the email unsent if you are only proving the handoff.
- Send a second brief that only says "make the header premium and moody". The agent should ask what is physically in the frame instead of generating.
Landing pages use the same files. Open Content > Landing Pages, click the image module, and choose Replace. Ads use Marketing > Ads. On a Facebook or LinkedIn ad, the creative step includes Image/Video. Upload the still there, then use Exit and Save and Exit so the ad stays a draft. Google search ads in HubSpot are a different creative. This guide does not claim they take a still.
Stage 6: Optional Files API
Skip this stage if people will upload by hand. Use it only when a token already exists and the still must land in the files tool without the picker.
- Create the HubSpot token with the scopes on Files API and Import file from URL. Requests use
Authorization: Bearerand that token. This is not the Brandiseer key. - Generate the still in Brandiseer first. HubSpot has to be able to fetch
imageUrlfor an import. If the URL is not public, download the file and upload the bytes instead. - Import from URL with HubSpot's documented call:
POST https://api.hubapi.com/files/2026-09/files/import-from-url/async. The live schema marksaccess,duplicateValidationScope,duplicateValidationStrategy, andoverwriteas required. Seturlto the BrandiseerimageUrl. SetfolderPathorfolderId(the property text says one of them must be set). For an email or landing page that must render the image, pick a public access value from the schema (PUBLIC_INDEXABLEorPUBLIC_NOT_INDEXABLE). The Files API guide says a private file's public URL returns404. A202body is a task locator withid. - Poll
GET https://api.hubapi.com/files/2026-09/files/import-from-url/async/tasks/{taskId}/statuswith the same HubSpot token. The Files API guide listsPENDING,PROCESSING,CANCELED, andCOMPLETE. OnCOMPLETE, read the file withGET https://api.hubapi.com/files/2026-09/files/{fileId}and keepurlfor the editor. OnCANCELED, stop and upload the file by hand. - If you already have the file on disk, the multipart upload is
POST https://api.hubapi.com/files/2026-09/fileswithfile,options(JSON, andaccessis required inside it), and eitherfolderIdorfolderPath. A201body includesid,url, anddefaultHostingUrl. That file is in the files tool. It is not yet inside an email, page, or ad. - A person still places the file in the module or ad. Do not send the email in the smoke test.
File size and image types for the files tool are in Supported file types and sizes: up to 20 MB on free tools, up to 2 GB on paid subscriptions, and image formats jpg, jpeg, png, tif, tiff, ico, bmp, and webp. If a marketing email rejects the type, export a .png or .jpg and upload that. Marketing emails do not list webp.
Stage 7: Optional HubDB image column
Skip this stage unless a landing page already reads a HubDB IMAGE column and you already have a token. The row update and publish pages list Marketing Hub Professional and CMS Hub Professional in their product tier block.
- Read the image value shape on the HubDB guide. An
IMAGEcolumn stores an object withurl,width,height, andtypeset toimage. The sample there uses a HubSpot-hosted file URL. Column names are yours. Do not guess them. - Update the draft row with the call on Update a row:
PATCH https://api.hubapi.com/cms/hubdb/2026-09/tables/{tableIdOrName}/rows/{rowId}/draft. Scopes on that page arehubdb-data-appendandhubdb-data-write. The description says you only need the columns you are changing. The schema also listschildTableId,displayIndex, andvaluesas required. If a body that only containsvaluesis rejected, copychildTableIdanddisplayIndexfrom the current row and change only the image column. Put the image undervaluesusing the real column name and the object shape from the HubDB guide. - Confirm the draft row in HubSpot. Do not publish during the smoke test.
- Publishing is a separate call:
POST https://api.hubapi.com/cms/hubdb/2026-09/tables/{tableIdOrName}/draft/publish, scopehubdb-publish, documented on Publish a table from draft. HubSpot's description says this copies draft data to the published version and that website pages using the table will be updated. A person runs that only after they have reviewed the still.
A HubDB write does not place a static email header. Email headers stay on the files tool and the email editor.
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 HubSpot slot to a documented ratio. Email header and landing-page hero:
16:9. Campaign thumbnail:1:1. Ad still:1:1or16:9, matching the placement the human named. Portrait stories:9:16. A slide-like module:4:3. Brandiseer does not offer network-specific ad ratios. Crop in HubSpot's image editor if the slot is tighter. The ads image editor is documented in Edit images. - Prefer
designfor finished campaign stills.fastis the API default if you omitmode, and it is the right fallback if a design job fails once. - Prefer
1Kor2Kso the file stays comfortable for email.4Kis optional. - Set
useLogotrue only when the brief asked for a logo (or your default says so). Headlines that the email or page will set in HubSpot text 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 campaign stills. Replace the placeholders before the first generate.
You generate on-brand stills for HubSpot campaigns. Brandiseer returns an
image URL. You do not upload into HubSpot by yourself, and you do not send
the email, publish the landing page, or publish the ad.
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 header and landing-page hero aspectRatio: 16:9
- Campaign thumbnail aspectRatio: 1:1
- Ad still aspectRatio: ask if the placement is not known (1:1 or 16:9)
- mode: design
- resolution: 2K
- 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.
5. Generate one still. Return imageUrl, aspectRatio, mode, resolution,
useLogo, and a placement note: files tool plus the email module, landing
page, campaign thumbnail, or ad the human named.
6. Do not tell the user HubSpot changed unless a HubSpot call you actually
performed returned success. A files upload is not an email send.
HubSpot, only when the human already supplied a token and asked for a
files import or a HubDB draft update:
- Authorization: Bearer, the HubSpot token. Never the Brandiseer key.
- Files import: POST https://api.hubapi.com/files/2026-09/files/import-from-url/async
Follow https://developers.hubspot.com/docs/api-reference/latest/files/files/import-from-url
Set url to the public Brandiseer imageUrl. If HubSpot cannot fetch it,
tell the human to download and upload in Content > Files.
- Poll GET https://api.hubapi.com/files/2026-09/files/import-from-url/async/tasks/{taskId}/status
until the Files API guide status is COMPLETE or CANCELED.
- Multipart upload, when you have the file bytes:
POST https://api.hubapi.com/files/2026-09/files
Follow https://developers.hubspot.com/docs/api-reference/latest/files/guide
- HubDB image, only with a real table id, row id, and column name:
PATCH https://api.hubapi.com/cms/hubdb/2026-09/tables/{tableIdOrName}/rows/{rowId}/draft
Image object shape from
https://developers.hubspot.com/docs/api-reference/latest/cms/hubdb/guide
Do not call
POST https://api.hubapi.com/cms/hubdb/2026-09/tables/{tableIdOrName}/draft/publish
unless the human explicitly asks after they have reviewed the draft.
That publish updates website pages that use the table.
- Do not patch marketing email content. A person places the file in the
email editor.
Out of scope:
- Slack replies, Buffer scheduling, Zapier, Make, or n8n scenarios, and
Webflow Designer.
- 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 = {
"email header": "16:9",
header: "16:9",
email: "16:9",
hero: "16:9",
"landing hero": "16:9",
"landing page": "16:9",
banner: "16:9",
"16:9": "16:9",
thumbnail: "1:1",
"campaign thumbnail": "1:1",
square: "1:1",
"1:1": "1:1",
ad: "1:1",
"ad still": "1:1",
"4:3": "4:3",
slide: "4:3",
portrait: "9:16",
story: "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 header smoke test passes. They do not change Brandiseer's image contract, and they do not give Brandiseer a HubSpot push.
Approval before send
After imageUrl is in the files tool and on the draft email, page, or ad, a named reviewer checks the still in HubSpot. Only then send the email, publish the page, or publish the ad. Until that happens, leave the content in draft. Brandiseer does not approve legal claims, prices, or offers.
One brand per HubSpot portal
Keep a table: HubSpot portal name, token secret name, and bds_c_.... Require a token on every API write when more than one portal exists. If the name misses, stop and list the portals you configured. Confirm Brand IDs with GET /api/v1/brands. Never fall through to another client's Brand ID or another portal's token.
Credit soft-limit
When credits is under a threshold you choose (for example 40), switch new campaign 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: email, page, or ad, slot, brandId, mode, aspectRatio, resolution, imageUrl, and whether it was uploaded in the files tool, imported by the Files API, or written to a HubDB draft row. Brandiseer does not write this log. HubSpot does not send it back to Brandiseer.
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. - Homepage and CMS stills that live on a Webflow site: Webflow site visuals.
Do not embed Buffer, a Slack desk, an always-on HTTP scenario, or a Webflow Designer step inside this HubSpot guide.
Optional motion (not the campaign MVP)
Video is image-to-video only. 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 a different contract 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. A HubSpot ad that accepts video is a separate upload in the ads tool. Leave this off unless the brief explicitly asks to animate.
Limits & FAQ
Does Brandiseer update HubSpot emails, pages, or ads?
No. Brandiseer returns imageUrl. A person uploads the file in the files tool and places it in an email image module, a landing page, or an ad. A Files API upload only adds a file to the files tool. A HubDB draft update only changes table data. Neither call sends an email or publishes an ad.
Is there a Brandiseer app inside HubSpot?
No. There is no Brandiseer panel in the email editor in this guide. Do not look for a native "send to HubSpot" button on the Brandiseer side.
What if HubSpot rejects the image?
Check Supported file types and sizes and the marketing-email note on Use images in HubSpot content. Marketing emails accept .png, .ico, .bmp, .jpg, and .gif. The files tool also lists webp, tif, and tiff, which the email note does not. If the picker rejects the file, export PNG or JPEG and upload that. Files on free tools are limited to 20 MB. An import also fails when HubSpot cannot fetch imageUrl. Download the still and upload the bytes.
Which HubSpot calls are in this guide?
Only calls confirmed on HubSpot's developer pages, and only at the level those pages describe:
- Files upload:
POST https://api.hubapi.com/files/2026-09/fileson the Files API guide - Import from URL:
POST https://api.hubapi.com/files/2026-09/files/import-from-url/asyncand statusGET https://api.hubapi.com/files/2026-09/files/import-from-url/async/tasks/{taskId}/statuson Import file from URL and the Files API guide - HubDB image value: the create-row example on the HubDB guide
- HubDB draft row:
PATCH https://api.hubapi.com/cms/hubdb/2026-09/tables/{tableIdOrName}/rows/{rowId}/drafton Update a row - HubDB publish, after review:
POST https://api.hubapi.com/cms/hubdb/2026-09/tables/{tableIdOrName}/draft/publishon Publish a table from draft
Folder ids, table ids, row ids, and column names come from your portal and from those pages. This guide does not invent a "set email header" endpoint.
Can I use HubSpot's own MCP?
HubSpot documents a remote MCP server at https://mcp.hubspot.com (AI tools, remote server). This guide does not depend on it and does not name its tools. If you connect it, call only tools that server actually exposes. Brandiseer still only returns the still. A HubSpot tool that matches the Files API or a HubDB image column is fine when its schema matches those pages. Do not assume a tool writes an email module.
Where do the keys live?
The Brandiseer key (bds_...) and the HubSpot token live in the agent host's secret store. Never in a CRM property, 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 HubSpot with the HubSpot token.
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.
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 ad preview?
Brandiseer aspect ratios are 1:1, 16:9, 9:16, and 4:3. Generate the closest slot, then crop in HubSpot. Network pixel rules belong to the ad network and to HubSpot's ads editor. This guide does not invent a Facebook or LinkedIn pixel size.
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 campaign 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 or publish. Brandiseer does not review the claim.
Are files public?
HubSpot's upload article says files in the files tool are hosted on a public file URL by default. The Files API guide says a private file's returned URL results in 404, and a signed URL is the way to view it. Emails and landing pages that must render the image need a public file. Choose the public access value on the import schema when you use the API, and follow HubSpot's file visibility settings when you upload by hand.
Demo / motion
Motion brief only. This is not an embed, and there is no walkthrough URL yet.
Working title: HubSpot campaign creatives Length: 45 to 75 seconds
Story beats:
- A person asks Cursor or Cowork for an email header with a layout-only brief
- The agent calls Brandiseer (MCP or REST v2) and shows an on-brand still
imageUrlis uploaded in HubSpot's files tool and placed on a draft marketing email- Optional cut: the same still is selected on a draft landing page or a draft ad, still unsent
- A human sends or publishes only after the offer reads correctly
On screen: the agent transcript with the prompt (no colour or mood words), one finished still, and the HubSpot files tool. Blur the Brandiseer API key and the HubSpot token. Do not show a fake video player in the guide.
Example flows
Flow A: Email header, placed in a draft email
The brief: "Email header for the spring drop. Product on the left. Leave the right half empty. The email heading will sit there. No logo on the image."
The agent selects the default brandId, sets aspectRatio to 16:9, mode to design, resolution to 2K, and useLogo to false, and returns imageUrl. You upload the file in Content > Files and assign it to the email image module. You send later, after the heading and the offer have been read by a person.
Flow B: Landing-page hero
The brief: "Landing-page hero. Product along the bottom. Leave the top empty for the page heading. No on-image text."
The agent uses 16:9 and returns imageUrl. You upload the file and replace the hero image on the landing page. Leave the page unpublished if you are only proving the handoff. One Design 2K still costs 6 credits. A failure refunds that still.
Flow C: Campaign thumbnail
The brief: "Square thumbnail for the spring campaign. Bottle in the centre. On-image text Spring drop along the bottom."
The agent uses 1:1. "Campaign thumbnail" here means that square still. It is not a hidden property on the HubSpot campaign object. You upload it and use it wherever that campaign surface already accepts an image (the email, the landing page, or the ad). This guide does not invent a campaign-image API.
Flow D: Ad still, saved as a draft
The brief: "Square still for the Facebook website-visit ad. Bottle centred. On-image text Spring drop in the top third."
The agent uses 1:1 and says the network may want a different frame. You upload the file, open Marketing > Ads, and set Image/Video on the draft. If the preview crops badly, use HubSpot's clone-and-edit crop on that image. Save and exit. Do not click Publish in the smoke test. LinkedIn image ads in HubSpot use the same idea: a person uploads the still on the ad. This flow is not Buffer scheduling.
Flow E: Credit check before a campaign set
Before a set of four stills (header, hero, thumbnail, ad), the agent calls brandiseer_check_credits or GET https://brandiseer.com/api/v1/credits and reads credits. Four Design 2K stills need 24 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 F: Style-only brief
The brief: "Make the header feel premium and moody."
The agent does not generate. It asks which email or page, 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.
Related use cases
- Webflow site visuals: an agent generates site stills and a person places
imageUrlin Webflow - 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 HubSpot campaign creatives. Brandiseer MCP and REST v2 image generation from Cursor or Claude Cowork, then a human places imageUrl in HubSpot's files tool, a marketing email, a landing page, or an ad. Aligned with guide/docs and guide/image (23 September 2026). Optional Files API and HubDB calls follow HubSpot's 2026-09 endpoint pages. Brandiseer does not push into HubSpot. Distinct from Webflow site visuals, Slack creative desk, Buffer social scheduling, and Zapier, Make, or n8n always-on HTTP.
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 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. MCP does not edit HubSpot.
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 HubSpot. 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 HubSpot at the Brandiseer MCP URL.
Field mapping
| Incoming field | API | Rule |
|---|---|---|
| Slot (email header, landing hero, thumbnail, ad) | aspectRatio | Header and landing hero: 16:9. Thumbnail: 1:1. Ad: 1:1 or 16:9. Portrait: 9:16. Slide: 4:3. |
| headline | inside prompt only | On-image text and placement. Not a separate body field. Leave it out when HubSpot text will set the headline. |
| brandId | brandId | bds_c_.... Required. |
| mode | mode | fast, design, or pro. Omit and the API uses fast. Prefer design for campaign 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 for email. |
Example JSON
Use this body for both sync and async. Only the URL and the response change.
{
"brandId": "bds_c_...",
"prompt": "Wide email header. Product centred on the left third. Empty right half for a headline the email will set in HubSpot. 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. HubSpot gets imageUrl (or a file you downloaded from it).
Slot prompts that stay layout-only:
| Slot | aspectRatio | Prompt |
|---|---|---|
| Email header | 16:9 | Wide email header. Product centred on the left third. Empty right half for a headline the email will set in HubSpot. No on-image text. |
| Landing-page hero | 16:9 | Wide landing-page hero. Product cluster along the bottom edge. Upper two thirds empty for a page heading. No on-image text. |
| Campaign thumbnail | 1:1 | Square campaign thumbnail. Single product in the centre. On-image text: "Spring drop" along the bottom edge. |
| Ad still | 1:1 | Square ad still. Product centred. On-image text: "Spring drop" in the top third. Empty corner bottom right. |
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.
