{"schemaVersion":"1.0.0","kind":"brandiseer.use-case","id":"wordpress-site-visuals","canonicalUrl":"https://blog.brandiseer.com/use-cases/wordpress-site-visuals","contentHash":"cefa4355ea8b1c3aef03db9bdb6c80691d0e2304d54ecd3c6b35391e2097112f","metadata":{"title":"WordPress site visuals","outcome":"An agent generates on-brand heroes, section stills, featured images, and OG cards with Brandiseer; a person places imageUrl in the WordPress Media Library, block editor, featured image, or an existing custom field. Brandiseer does not push into WordPress and does not publish the site.","category":"creative-mcp","featured":true,"timeEstimate":"~25 to 40 min setup","methods":["MCP","REST"],"hosts":["Cursor","Cowork"],"image":"https://blog.brandiseer.com/use-case-assets/wordpress-site-visuals/cover-wordpress-site-visuals.png","updated":"2026-09-25"},"stack":[{"name":"Brandiseer","role":"Brand memory and on-brand stills via MCP or REST","logo":"/logo-b.png","href":"https://brandiseer.com"},{"name":"WordPress","role":"Media Library, block editor, featured image, and custom fields. A person places the still.","href":"https://wordpress.org"},{"name":"Cursor","role":"Agent host for Brandiseer MCP or REST"},{"name":"Claude Cowork","role":"Agent host for Brandiseer MCP or REST"}],"workflow":{"audience":"- Marketing and web teams whose pages already live in WordPress and who need a homepage hero, a section still, a featured image, or a share image without opening a separate design tool for every page\n- Agencies that keep one Brandiseer Brand ID per client and one WordPress site per client\n- Operators who can download an `imageUrl` and upload it on **Media > Add New**, or paste that URL into an Image block with **Insert from URL**\n\n**Ideal customer profile:** a team whose pages and posts already live in WordPress, whose brand already lives in Brandiseer, and whose missing piece is a brand-safe still plus a clear handoff into the Media Library, the block editor, the featured image, or a custom field the site already uses.","rationale":"WordPress is where the page is built. Cursor or Cowork is the agent that turns a page 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.\n\nA WordPress site 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 site. WordPress still decides which block, featured image, or custom field receives the file, and a person decides when that change is saved on a published page.\n\nThis is a different job from the sibling guides:\n\n- [Slack creative desk](/use-cases/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.\n- [Social media automation](/use-cases/social-media-automation) writes captions and schedules posts with Buffer.\n- [Always-on creative automation](/use-cases/always-on-creative-automation) is the HTTP step in Zapier, Make, or n8n.\n- [Webflow site visuals](/use-cases/webflow-site-visuals) generates site stills and hands `imageUrl` to Webflow.\n- [HubSpot campaign creatives](/use-cases/hubspot-campaign-creatives) generates campaign stills and hands `imageUrl` to HubSpot.\n- [Klaviyo email heroes](/use-cases/klaviyo-email-heroes) generates email heroes and hands `imageUrl` to Klaviyo.\n- [Shopify product visuals](/use-cases/shopify-product-visuals) generates product stills and hands `imageUrl` to Shopify.\n- This guide generates homepage heroes, section stills, featured images, and OG cards and hands `imageUrl` to a person who places them in WordPress. Brandiseer does not push into WordPress and does not publish the site.\n\n![Example strip: homepage hero, section still, featured image, and OG card](https://blog.brandiseer.com/use-case-assets/wordpress-site-visuals/example-strip.png)","architecture":"Architecture, from page brief to a still sitting in WordPress:\n\n1. You store the brand once in Brandiseer (logo and reference visuals teach the look).\n2. The agent host (Cursor or Cowork) has Brandiseer MCP or REST, the Brand ID (`bds_c_...`), and the standing instructions in this guide.\n3. You name the slot: homepage hero, section still, featured image, or OG card. The agent rewrites that brief into subject, layout, and on-image text, then sets `aspectRatio`, `resolution`, `mode`, and `useLogo` as fields.\n4. Brandiseer returns `imageUrl`. The agent reports the URL, the crop, the mode, a one-line alt text suggestion, and a placement note (which page, block, featured image, or custom field). It does not claim wp-admin changed.\n5. A person downloads the file or pastes the URL into an Image block, uploads it to the Media Library, and places it. They leave the page or post as a draft until they have reviewed the still.\n\n![Workflow infographic: brief, Brandiseer still, imageUrl, a person uploads, a person places the image](https://blog.brandiseer.com/use-case-assets/wordpress-site-visuals/workflow-infographic.png)","prerequisites":"- Company website URL, if the brand is not in Brandiseer yet\n- Brandiseer account with at least one finished brand profile\n- API key (`bds_...`) from [Settings → API](https://brandiseer.com/settings/api) or [Developers](https://brandiseer.com/developers)\n- Brand ID (`bds_c_...`) for every brand the agent may call\n- Credits for the stills you actually generate (see the table in Limits & FAQ)\n- Cursor or Claude Cowork, with Brandiseer MCP or a way to call REST\n- A WordPress site you can edit in the block editor\n- Access to **Media > Add New** and to the page or post you will update\n- Permission to upload files. The Media Add New screen prints the host's maximum upload size. Check the downloaded file against that number before you upload\n- Optional: the custom field **Name** the theme or a plugin already uses for an image URL, if that slot is in the brief. Read it from the post. Do not guess it\n\nThis workflow does not need a WordPress application password.","setup":"### Stage 1: Add your brand on Brandiseer\n\n1. Go to [brandiseer.com](https://brandiseer.com). In the homepage input, enter your company website URL and click **Try My Brand**.\n2. Wait about one minute while Brandiseer analyses the site and picks a logo and visuals.\n3. Review those visuals carefully. They teach Brandiseer your look. Every later WordPress still is influenced by what you leave here.\n4. Remove anything off-brand (partner logos, stock, irrelevant screenshots). Add page photography that matches the look you want.\n5. Click **Add Brand**, sign up if prompted, then wait about 30 seconds for the brand profile to finish.\n\nAgencies repeat this once per client. Do not point two WordPress sites at one Brand ID.\n\n### Stage 2: API key and Brand ID\n\n1. Open [brandiseer.com/developers](https://brandiseer.com/developers) or [Settings → API](https://brandiseer.com/settings/api).\n2. Create an API key (`bds_...`). Put it in the agent host's secret store. Do not paste it into a WordPress post, a custom field, Slack, or a git repo.\n3. Copy the Brand ID (`bds_c_...`).\n4. 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`.\n5. Optional reachability check, no key required: `GET https://brandiseer.com/api/v1/health` returns `{ \"status\": \"ok\" }`.\n\nRead [guide/docs](https://brandiseer.com/guide/docs) and [guide/image](https://brandiseer.com/guide/image) once while you write the standing instructions. Those pages are the live contract if a field name ever moves.\n\n### Stage 3: Connect Brandiseer to the agent host\n\nUse Cursor or Cowork. One host is enough.\n\n**A. MCP**\n\n1. Add the Brandiseer MCP server at `https://brandiseer.com/api/mcp`.\n2. Authenticate with `Authorization: Bearer` and the API key, in the secret field your host provides.\n3. 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](https://brandiseer.com/guide/docs) documents it.\n\n**B. REST**\n\n1. On [Developers](https://brandiseer.com/developers), open **View Docs** and use **Copy for LLM** if you want the reference inside the session.\n2. 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`.\n3. 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.\n\n### Stage 4: Save the standing instructions\n\n1. Paste the **System prompt** from this guide into the Cursor rule or Cowork instructions that will run site stills.\n2. 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.\n3. Ask the agent to call `brandiseer_list_brands` (or `GET /api/v1/brands`) and confirm the Brand ID exists before the first paid still.\n\n### Stage 5: Smoke test a hero in the block editor\n\n1. Ask for one homepage hero with a layout-only brief (the Spring hero in Example flows).\n2. Confirm the agent checked the brand, avoided colour and mood words, and returned `imageUrl` plus crop, mode, and a placement note. Open the URL in a browser before you place it.\n3. Download the file. Compare its size with the maximum shown on **Media > Add New**. If the file is larger than that host limit, regenerate at `1K` and download again.\n4. Upload it with drag-and-drop or **Select Files**. In the Media Library, open the item and set **Alt Text**. Block-level alt text applies only to that one page. Alt text stored on the attachment is the default when you insert the file again. See the Image block article.\n5. Open a page you are willing to edit and leave **Status** as **Draft**. Add a Cover block with `/cover`. Choose **Media Library** and select the file, or **Upload** the same file. Put the page heading in the Cover's inner text. Leave that region empty on the still. If the Cover crops the frame and **Fixed background** is off, drag the focal point onto the subject. See [Cover block](https://wordpress.org/documentation/article/cover-block/).\n6. Alternative for a still that is not a full-bleed header: add an Image block, choose **Insert from URL**, paste `imageUrl`, press Enter, then click **Upload to Media Library**. If **Insert from URL** fails, the Image block article says some sites block embedding. Download the file and use **Upload** or **Media Library** instead.\n7. Add alt text in the block's **Content** tab, or mark the image decorative only when it carries no information. Click **Save draft**. Do not click **Publish**.\n8. 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.\n\n### Stage 6: Featured image\n\nSkip this stage unless the brief is a featured image or an OG card you are placing through the featured image.\n\nThe [Page/Post settings](https://wordpress.org/documentation/article/page-post-settings-sidebar/) article says featured images (also called post thumbnails) are used in different ways depending on the theme. Many themes use the image to showcase the post on the home page or the blog index. The Learn WordPress tutorial [How to use featured images](https://learn.wordpress.org/tutorial/32894-2/) says a featured image is how you pick which image appears when someone shares the post or page, and that plugins can refine the social image further. Core's editor articles do not document a separate Open Graph image control. If the site already has a plugin field for a different social image, use that plugin's own screen. This guide does not name plugin endpoints.\n\n1. Work on a draft post or page.\n2. Upload the still in **Media > Add New** if it is not in the library yet.\n3. In the Post or Page sidebar, click **Set featured image**, select the file, and click **Set featured image**. You can also drag a file from your computer into the featured image box on that panel.\n4. Or select an Image block that already uses a library file and choose **Set as featured image** under **More options** (the three dots). See [Image block](https://wordpress.org/documentation/article/image-block/).\n5. The [Post Featured Image block](https://wordpress.org/documentation/article/post-featured-image-block/) displays that choice inside a template or a query loop. It does not upload a file. Add it in the site editor only when you are changing how the theme shows the image, and only on a template you are willing to edit.\n6. Click **Save draft**. Use **Replace** later if the still is wrong. Do not publish from this smoke test.\n\nFor an OG card, generate at `16:9`. Brandiseer has no 1.91:1 ratio. Crop in the Media Editor (**Crop** on the Image block or Cover block) if the preview needs a tighter frame. WordPress saves that edit as a new file and keeps the original in the Media Library.\n\n### Stage 7: Custom field that already stores an image URL\n\nSkip this stage unless the brief names a custom field the site already uses.\n\nWordPress documents custom fields as extra metadata on a post: a **Name** and a **Value**, saved with **Add Custom Field**. The [custom fields article](https://wordpress.org/documentation/article/assign-custom-fields/) shows that with text examples. Displaying the value is theme work (`the_meta()`, `get_post_meta()`, or `get_post_custom_values()`). Core does not turn that value into a hero by itself.\n\n1. If the custom fields panel is missing, open **Preferences** from the three-dot menu in the editor. The [Preferences](https://wordpress.org/documentation/article/preferences/) article says the General tab has an Advanced section that adds extra areas to the editor. Use the label on your screen. The Page/Post settings article says Preferences is how you choose which sidebar sections appear.\n2. Select the **Name** the site already uses. If you need a new Name, stop and ask the person who owns the theme. Do not invent one in this guide.\n3. Paste `imageUrl` into **Value** only when that Name is already defined as a URL. If the field expects an attachment ID, upload the file first and use the ID WordPress shows on the attachment. Do not put the Brandiseer URL into an ID field.\n4. Click **Add Custom Field** (or update the existing value) and save the draft. Do not publish.","promptingRules":"When the agent builds `prompt`:\n\n- Keep subject, layout, composition, and on-image text (what the words say and where they sit).\n- Never send brand colours, fonts, mood, or visual style. Brand memory already applies those. Style words fight the brand and produce off-brand stills.\n- Put crop in `aspectRatio`, quality in `mode`, pixel size in `resolution`, and logo on/off in `useLogo`. Those are body fields, not prompt prose.\n- Map the WordPress slot to a documented Brandiseer ratio. Homepage hero and full-bleed section: `16:9`. Featured image: `16:9`, `4:3`, or `1:1`, matching the theme crop the human names. OG card: `16:9`. Portrait site slots: `9:16`. Brandiseer does not offer a 1.91:1 OG ratio. Crop in WordPress if the slot is tighter than 16:9.\n- Prefer `design` for finished site stills. `fast` is the API default if you omit `mode`, and it is the right fallback if a design job fails once.\n- Prefer `2K`. Drop to `1K` when the file would miss the maximum upload size shown on Media Add New. `4K` is optional and easier to reject on a small host limit.\n- Set `useLogo` true only when the brief asked for a logo (or your default says so). Headings that a Cover block or a theme title will render should stay off the image. Say \"empty region\" for that area instead of describing a font.\n- Full rules: [Prompt compatibility](https://brandiseer.com/guide/image).","systemPrompts":"Paste this into Cursor or Cowork as the standing instructions for WordPress site stills. Replace the placeholders before the first generate.\n\n```text\nYou generate on-brand heroes, section stills, featured images, and OG cards\nfor a WordPress site. Brandiseer returns an image URL. You do not push\npixels into WordPress, and you do not publish the site.\n\nBrandiseer:\n- MCP: https://brandiseer.com/api/mcp with Authorization: Bearer.\n  Tools you may call: brandiseer_list_brands, brandiseer_check_credits,\n  brandiseer_generate_image. Do not invent tool names.\n- REST: X-API-Key: bds_... (secret store only).\n  Prefer POST https://brandiseer.com/api/v2/generate\n  or POST https://brandiseer.com/api/v2/generate/async\n  then poll GET https://brandiseer.com/api/v2/jobs/:jobId every 3 to 5 seconds\n  until data.status is done or failed, or about 10 minutes have passed.\n- Live contract: https://brandiseer.com/guide/docs and\n  https://brandiseer.com/guide/image\n\nDefaults for this site (fill in once):\n- Brand ID: bds_c_...\n- Hero and section aspectRatio: 16:9\n- Featured image aspectRatio: ask if the theme crop is not known (16:9, 4:3, or 1:1)\n- OG card aspectRatio: 16:9 (there is no 1.91:1 Brandiseer ratio)\n- mode: design\n- resolution: 2K (use 1K if the host upload limit is in play)\n- useLogo when the brief is silent: false\n- Multi-brand map, if any: brand name to bds_c_...\n\nOn every request:\n1. Resolve brandId from the brief or the default. If more than one brand\n   exists and the brief does not name one, ask. Never fall through to\n   another client's Brand ID.\n2. Check credits before a batch (brandiseer_check_credits or\n   GET https://brandiseer.com/api/v1/credits). A single still can proceed\n   if the last known balance covers the mode and resolution in the table\n   you were given. On 402, stop.\n3. Rewrite the brief into subject, layout, composition, and on-image text.\n   Strip colours, fonts, mood, and visual style. If stripping leaves no\n   physical subject, ask what is in the frame. Do not generate.\n4. Choose aspectRatio from the slot. Put resolution, mode, and useLogo in\n   API fields, not in the prompt. Do not invent a theme pixel size.\n5. Generate one still. Return imageUrl, aspectRatio, mode, resolution,\n   useLogo, a one-line alt text suggestion, and a placement note:\n   Cover or Image block on a named draft page, featured image on a named\n   draft post, or the custom field Name the human already uses.\n6. Do not tell the user the WordPress site changed unless they confirm\n   they placed the file. Do not publish a page or a post.\n\nWordPress placement is human only:\n- Media: Media > Add New, drag-and-drop or Select Files. The screen shows\n  the host maximum upload size. Uploading does not place the file.\n- Image block: Upload, Media Library, or Insert from URL then Upload to\n  Media Library. If Insert from URL fails, the person downloads the file.\n- Cover block: Upload or Media Library. The heading stays in the Cover's\n  inner text when the brief says the page will set it.\n- Featured image: Set featured image in the Post or Page sidebar, or\n  Set as featured image on an Image block. Core has no separate OG field.\n  An OG card is placed as the featured image unless the human names\n  another field their site already has.\n- Custom fields: paste into the Value of a Name the human already uses.\n  Do not invent the Name.\n- Do not call the WordPress REST API. Do not invent API paths. Do not ask\n  for a WordPress password or application password.\n\nOut of scope:\n- Slack replies, Buffer scheduling, and Zapier, Make, or n8n scenarios.\n- Webflow site placement, HubSpot files or ads, Klaviyo email placement,\n  and Shopify product placement.\n- Theme code, plugin code, and new custom field names.\n- Legal approval of claims, prices, or offers printed on the image.\n- GET https://brandiseer.com/api/v1/usage (browser session only).\n```\n\n\n### Prompt rewriter\n\nUse 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.\n\n```javascript\n// Local rewriter for a Cursor or Cowork helper script.\n// Keeps subject, layout, composition, and on-image text.\n// Strips colour, type, mood, and visual-style language.\n\nconst STYLE_WORDS =\n  /\\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;\n\nconst SLOT_TO_RATIO = {\n  hero: \"16:9\",\n  homepage: \"16:9\",\n  banner: \"16:9\",\n  section: \"16:9\",\n  cover: \"16:9\",\n  background: \"16:9\",\n  \"16:9\": \"16:9\",\n  featured: \"16:9\",\n  og: \"16:9\",\n  \"open graph\": \"16:9\",\n  card: \"4:3\",\n  \"4:3\": \"4:3\",\n  square: \"1:1\",\n  \"1:1\": \"1:1\",\n  portrait: \"9:16\",\n  \"9:16\": \"9:16\",\n};\n\nfunction rewriteBrandiseerPrompt(input) {\n  const headline = String(input.headline || \"\").trim();\n  const subject = String(input.subject || input.brief || \"\").trim();\n  const slotKey = String(input.slot || input.crop || \"\").trim().toLowerCase();\n  const aspectRatio = SLOT_TO_RATIO[slotKey] || \"\";\n\n  let prompt = [subject, headline ? `On-image text: \"${headline}\".` : \"\"]\n    .filter(Boolean)\n    .join(\" \");\n\n  prompt = prompt\n    .replace(/#[0-9a-f]{3,8}\\b/gi, \" \")\n    .replace(STYLE_WORDS, \" \")\n    .replace(/\\s+/g, \" \")\n    .trim();\n\n  return {\n    prompt,\n    aspectRatio,\n    needsSubject: prompt.length < 12 || !aspectRatio,\n  };\n}\n```\n\nIf `needsSubject` is true, ask the human for a subject and a slot. Do not POST.\n\nThe `featured` key above defaults to `16:9` only so a named featured-image brief can proceed. If the human has not confirmed the theme crop, ask before you generate. A square or 4:3 card needs an explicit slot.","addOns":"Add these after the hero smoke test passes. They do not change Brandiseer's image contract, and they do not give Brandiseer a publish button.\n\n### Approval before publish\n\nAfter `imageUrl` is in the Media Library and on the draft, a named reviewer checks the still, the alt text, and the heading that sits in the Cover. Only then may someone change **Status** away from **Draft** and publish. The Page/Post settings article lists **Draft** as the status for a page or post that is not ready to be published. Until that review, leave the live page on its current version. Brandiseer does not approve legal claims, prices, or offers.\n\n### One brand per WordPress site\n\nKeep a table: site name and `bds_c_...`. Require a site name on every brief when more than one site exists. If the name misses, stop and list the sites you configured. Confirm Brand IDs with `GET /api/v1/brands`. Never fall through to another client's Brand ID. There is no WordPress password in this table, because this guide does not call WordPress.\n\n### Credit soft-limit\n\nWhen `credits` is under a threshold you choose (for example 40), switch new site 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.\n\n### Placement log\n\nKeep a short note next to the work: site, page or post, slot, `brandId`, `mode`, `aspectRatio`, `resolution`, `imageUrl`, and whether it was uploaded, pasted with **Insert from URL**, set as the featured image, or stored in a custom field. Brandiseer does not write this log. WordPress does not send it back to Brandiseer.\n\n### Handoff to the sibling guides\n\n- Stills requested in Slack, returned in a thread: [Slack creative desk](/use-cases/slack-creative-desk).\n- Captions and a Buffer schedule: [Social media automation](/use-cases/social-media-automation).\n- A Zapier, Make, or n8n trigger that should deliver `imageUrl` on a schedule: [Always-on creative automation](/use-cases/always-on-creative-automation).\n- A homepage hero that lives in Webflow: [Webflow site visuals](/use-cases/webflow-site-visuals).\n- An email header, landing page, or ad that lives in HubSpot: [HubSpot campaign creatives](/use-cases/hubspot-campaign-creatives).\n- An email hero that lives in Klaviyo: [Klaviyo email heroes](/use-cases/klaviyo-email-heroes).\n- A product still that lives in Shopify: [Shopify product visuals](/use-cases/shopify-product-visuals).\n\nDo not embed Buffer, a Slack desk, an always-on scenario, Webflow, HubSpot, Klaviyo, or Shopify inside this WordPress guide.\n\n### Optional motion (not the site MVP)\n\nThe Cover block can use a video background, and it documents a poster image for that video. This guide does not generate that video file and does not publish it.\n\nBrandiseer 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 a different contract from image jobs (`done` and `imageUrl`). Read [guide/video](https://brandiseer.com/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 publish the page from this guide.","limitsAndFaq":"### Does Brandiseer update WordPress or publish the site?\n\nNo. Brandiseer returns `imageUrl`. A person uploads that file on **Media > Add New**, places it in an Image block or a Cover block, sets a featured image, or pastes the URL into a custom field the site already uses. Publishing stays in WordPress, after a person reviews the still.\n\n### Is there a Brandiseer plugin inside WordPress?\n\nNo. There is no Brandiseer block in the inserter in this guide. Do not look for a native \"send to WordPress\" button on the Brandiseer side.\n\n### What if WordPress rejects the image?\n\nThe hard ceiling is the maximum upload size printed on [Media Add New](https://wordpress.org/documentation/article/media-add-new-screen/). That number comes from the host. This guide does not invent a megabyte cap. [Image size and quality](https://wordpress.org/documentation/article/image-size-and-quality/) names `jpg`, `gif`, and `png` as the common web image types and treats file size as a loading concern. If the uploader rejects the file, download it, export a JPEG or PNG under the size on that screen, and upload again.\n\n**Insert from URL** can fail even when the file is valid. The Image block article says the option may not work with every image or website, because some sites block embedding. Download the file and use **Upload** or **Media Library**.\n\nAfter **Insert from URL**, click **Upload to Media Library**. The same article says an image left only on the remote address can stop displaying if that file is moved or no longer shared.\n\n### Which WordPress actions are in this guide?\n\nOnly human steps confirmed on WordPress.org's public articles:\n\n- **Media > Add New**: drag-and-drop or **Select Files**, then **Edit** or **Copy URL to clipboard**, on [Media Add New](https://wordpress.org/documentation/article/media-add-new-screen/).\n- Media Library attachment details, including **Alt Text** and **File URL**, on [Media Library](https://wordpress.org/documentation/article/media-library-screen/).\n- Image block: **Upload**, **Media Library**, **Insert from URL**, **Upload to Media Library**, alt text, and **Set as featured image**, on [Image block](https://wordpress.org/documentation/article/image-block/).\n- Cover block: **Upload**, **Media Library**, **Use featured image**, focal point, and inner text, on [Cover block](https://wordpress.org/documentation/article/cover-block/).\n- Featured image: **Set featured image**, **Replace**, and **Remove**, on [Page/Post settings](https://wordpress.org/documentation/article/page-post-settings-sidebar/).\n- Display of that image in a template: [Post Featured Image block](https://wordpress.org/documentation/article/post-featured-image-block/).\n- Custom fields: **Name**, **Value**, and **Add Custom Field**, on [Custom fields](https://wordpress.org/documentation/article/assign-custom-fields/).\n\nThis guide does not call the WordPress REST API and does not publish the site.\n\n### What does the REST reference actually list?\n\nRead these pages before anyone automates a later step. This guide does not call them.\n\nOn [Media](https://developer.wordpress.org/rest-api/reference/media/) (reference page last updated 16 January 2024):\n\n- `GET /wp/v2/media` lists media.\n- `POST /wp/v2/media` creates a media item. The arguments on that page are metadata such as `title`, `alt_text`, `caption`, `description`, and `post`. `source_url` is in the schema as the URL of the stored file, and it is read only. It is not a field you send to upload a remote image.\n- `GET /wp/v2/media/<id>` retrieves one item.\n- `POST /wp/v2/media/<id>` updates one item, including `alt_text`.\n- `DELETE /wp/v2/media/<id>` deletes one item. `force` bypasses Trash.\n\nThe [attachments controller reference](https://developer.wordpress.org/reference/classes/wp_rest_attachments_controller/) documents two upload shapes that the handbook page above does not spell out: raw body data, which requires a `Content-Disposition` header formatted as ``attachment; filename=\"image.png\"`` or similar, and `multipart/form-data`. The same class documents an optional `url` argument on create, since WordPress 7.1.0: a publicly reachable HTTP or HTTPS image URL to sideload, instead of uploading a file. The controller derives the filename from the URL path and rejects the request when that name is missing or is not an image type. A Brandiseer `imageUrl` often has no image extension, so that argument can reject it. Do not point this workflow at `url`. Download the file and upload it.\n\nOn [Posts](https://developer.wordpress.org/rest-api/reference/posts/), `featured_media` is an integer media ID. It is not a URL. Setting it is outside this guide.\n\nDo not invent a \"set the Cover background\" route. Do not send WordPress credentials to the agent.\n\n### Can the agent use a WordPress MCP or application password?\n\nNo. This workflow has no WordPress credential. If a host offers a WordPress connector, leave it disconnected for this guide. Brandiseer still only returns the still. A person places it.\n\n### Where does the key live?\n\nOnly the Brandiseer key (`bds_...`) is in play. It lives in the agent host's secret store. Never in a post, a custom field, a Slack message, a prompt you commit, or a git repo. Rotate it if it leaks. Poll a Brandiseer job with the same key that submitted it.\n\n### What do stills cost?\n\nCredits per still. Failures refund. Async submits deduct immediately and refund if the job fails.\n\n| Mode | 1K | 2K | 4K |\n| --- | --- | --- | --- |\n| Fast | 4 | 6 | 8 |\n| Design | 5 | 6 | 8 |\n| Pro | 6 | 8 | 10 |\n\n`402` means not enough credits. Pricing context: [brandiseer.com/pricing](https://brandiseer.com/pricing).\n\n### Why is the still off-brand?\n\nAlmost always because the prompt contained colours, fonts, mood, or visual style. Strip them and generate again. See [guide/image](https://brandiseer.com/guide/image).\n\nThe Image block and Cover block can also apply a duotone filter. That recolour is a WordPress control. Leave it off when you want the Brandiseer still to stay as generated.\n\n### Why does the crop look wrong on the page?\n\nBrandiseer aspect ratios are `1:1`, `16:9`, `9:16`, and `4:3`. Themes and Cover blocks crop featured images and heroes. Generate the hero and the OG card at `16:9`, then set a focal point on the Cover or crop in the Media Editor. Do not ask Brandiseer for a custom pixel size inside the prompt.\n\n### How long can I poll?\n\nAbout 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.\n\n### Which generate URL should new site work use?\n\n`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.\n\n### Does the agent approve claims on the image?\n\nNo. If the still has a price, a discount, or a legal line, a person reads it before that page is published. Brandiseer does not review the claim.\n\n### Does uploading to the Media Library publish the page?\n\nNo. **Media > Add New** stores the file. Assignment to a block, a featured image, or a custom field is a later human step. **Save draft** stores the edit without publishing. Publish is a separate control.","demo":"**Motion brief only. This is not an embed, and there is no walkthrough URL yet.**\n\n**Working title:** WordPress site visuals\n**Length:** 45 to 75 seconds\n\n**Story beats:**\n\n1. A person asks Cursor or Cowork for a homepage hero with a layout-only brief\n2. The agent calls Brandiseer (MCP or REST v2) and shows an on-brand still\n3. `imageUrl` is uploaded on Media Add New and placed on a Cover block, still a draft\n4. Optional cut: the same kind of still is set as the featured image, still unpublished\n5. A human reviews alt text and leaves publish for a later step\n\n**On screen:** the agent transcript with the prompt (no colour or mood words), one finished still, and the WordPress Cover block. Blur the Brandiseer API key. Do not show a published page, and do not show a fake video player in the guide."},"sections":[{"id":"overview","heading":"Overview","markdown":"**Brandiseer + WordPress (+ Cursor or Claude Cowork)**\n\n![Cover: an on-brand homepage hero ready to place on a WordPress site](https://blog.brandiseer.com/use-case-assets/wordpress-site-visuals/cover-wordpress-site-visuals.png)\n\nBy the end of this guide you will have a repeatable way to make on-brand stills for a WordPress site. An agent in Cursor or Claude Cowork calls Brandiseer, gets an `imageUrl` for a homepage hero, a section still, a featured image, or an OG card, and a person places that file in WordPress.\n\nBrandiseer owns the brand memory and the still. WordPress owns the page, the post, and the Media Library. Brandiseer does not open wp-admin, does not upload into the Media Library, and does not publish the site. A person downloads the file or pastes `imageUrl` where the block editor allows it, then assigns it. This guide does not call the WordPress REST API.\n\n> People who brief stills inside Slack should use [Slack creative desk](/use-cases/slack-creative-desk). Recurring captions and Buffer scheduling should use [Social media automation](/use-cases/social-media-automation). Schedules and webhooks in Zapier, Make, or n8n should use [Always-on creative automation](/use-cases/always-on-creative-automation). Site heroes that live in Webflow should use [Webflow site visuals](/use-cases/webflow-site-visuals). HubSpot emails, landing pages, and ads should use [HubSpot campaign creatives](/use-cases/hubspot-campaign-creatives). Klaviyo email heroes should use [Klaviyo email heroes](/use-cases/klaviyo-email-heroes). Shopify product and storefront stills should use [Shopify product visuals](/use-cases/shopify-product-visuals). This guide does not recreate any of those. It is WordPress site and media placement only."},{"id":"audience","heading":"Who it's for","markdown":"- Marketing and web teams whose pages already live in WordPress and who need a homepage hero, a section still, a featured image, or a share image without opening a separate design tool for every page\n- Agencies that keep one Brandiseer Brand ID per client and one WordPress site per client\n- Operators who can download an `imageUrl` and upload it on **Media > Add New**, or paste that URL into an Image block with **Insert from URL**\n\n**Ideal customer profile:** a team whose pages and posts already live in WordPress, whose brand already lives in Brandiseer, and whose missing piece is a brand-safe still plus a clear handoff into the Media Library, the block editor, the featured image, or a custom field the site already uses."},{"id":"why-brandiseer","heading":"Why Brandiseer in this stack","markdown":"WordPress is where the page is built. Cursor or Cowork is the agent that turns a page 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.\n\nA WordPress site 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 site. WordPress still decides which block, featured image, or custom field receives the file, and a person decides when that change is saved on a published page.\n\nThis is a different job from the sibling guides:\n\n- [Slack creative desk](/use-cases/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.\n- [Social media automation](/use-cases/social-media-automation) writes captions and schedules posts with Buffer.\n- [Always-on creative automation](/use-cases/always-on-creative-automation) is the HTTP step in Zapier, Make, or n8n.\n- [Webflow site visuals](/use-cases/webflow-site-visuals) generates site stills and hands `imageUrl` to Webflow.\n- [HubSpot campaign creatives](/use-cases/hubspot-campaign-creatives) generates campaign stills and hands `imageUrl` to HubSpot.\n- [Klaviyo email heroes](/use-cases/klaviyo-email-heroes) generates email heroes and hands `imageUrl` to Klaviyo.\n- [Shopify product visuals](/use-cases/shopify-product-visuals) generates product stills and hands `imageUrl` to Shopify.\n- This guide generates homepage heroes, section stills, featured images, and OG cards and hands `imageUrl` to a person who places them in WordPress. Brandiseer does not push into WordPress and does not publish the site.\n\n![Example strip: homepage hero, section still, featured image, and OG card](https://blog.brandiseer.com/use-case-assets/wordpress-site-visuals/example-strip.png)"},{"id":"stack","heading":"Stack","markdown":"| Layer | Tool | Role |\n| --- | --- | --- |\n| Brand visuals | Brandiseer MCP and/or REST v2 | Generate on-brand stills. MCP uses `Authorization: Bearer`. REST uses `X-API-Key: bds_...` |\n| Agent host (pick one) | Cursor | Read the page brief, call Brandiseer, return `imageUrl` and a placement note |\n| Agent host (pick one) | Claude Cowork | Same contract as Cursor for interactive site stills |\n| Site | WordPress | Media Library, block editor, featured image, and custom fields. A person places the still. |\n\n![Stack diagram: Cursor or Cowork, Brandiseer, and WordPress](https://blog.brandiseer.com/use-case-assets/wordpress-site-visuals/stack-diagram.png)\n\nYou only need one agent host. The Brandiseer contract is the same on both. WordPress has no Brandiseer plugin that drops a still onto a page. The handoff is an image URL or a download. A person places it.\n\n**Brandiseer docs:** [Developers](https://brandiseer.com/developers) · [guide/docs](https://brandiseer.com/guide/docs) · [guide/image](https://brandiseer.com/guide/image) · [Settings → API](https://brandiseer.com/settings/api)\n\n**WordPress docs:** [Image block](https://wordpress.org/documentation/article/image-block/) · [Cover block](https://wordpress.org/documentation/article/cover-block/) · [Media Add New](https://wordpress.org/documentation/article/media-add-new-screen/) · [Media Library](https://wordpress.org/documentation/article/media-library-screen/) · [Page/Post settings (featured image)](https://wordpress.org/documentation/article/page-post-settings-sidebar/) · [Post Featured Image block](https://wordpress.org/documentation/article/post-featured-image-block/) · [Custom fields](https://wordpress.org/documentation/article/assign-custom-fields/) · [Image size and quality](https://wordpress.org/documentation/article/image-size-and-quality/) · [REST media reference](https://developer.wordpress.org/rest-api/reference/media/) · [REST posts reference](https://developer.wordpress.org/rest-api/reference/posts/)\n\nUse the clicks on the wordpress.org articles. Do not invent a neighbouring admin path or a REST field. Those pages are the placement contract if a button label moves. Follow wordpress.org, not WordPress.com support pages that add extra image sources.\n\nEndpoint tables and HTTP contracts are in API reference at the end of this guide.\n\n\n### WordPress (placement, not generation)\n\nThree practical paths. A person does all of them. Use the one that matches the slot. Brandiseer stops at `imageUrl`.\n\n1. **Media Library (the file, not the page).** In wp-admin, open **Media > Add New**. Drag files into the upload area, or click **Select Files**. The screen shows the maximum upload size set by the host. When the upload finishes you can click **Edit** or **Copy URL to clipboard**. See [Media Add New](https://wordpress.org/documentation/article/media-add-new-screen/). This upload does not place the file in a block, set a featured image, or publish a page. Attachment details (Alt Text, Title, Caption, Description, File URL) are on the [Media Library](https://wordpress.org/documentation/article/media-library-screen/) screen.\n2. **Block editor (heroes and section stills).** On a draft page, add an Image block (`/image`) or a Cover block (`/cover`). The Image block offers **Upload**, **Media Library**, and **Insert from URL**. After **Insert from URL**, paste `imageUrl` and press Enter, then use **Upload to Media Library** in the block toolbar so the site keeps its own copy. The Image block article says an image left only on the remote URL can stop displaying if that file moves. The Cover block's starting options are **Upload**, **Media Library**, **Use featured image**, or a background colour. It does not list **Insert from URL** for a still. Download the file and upload it, or pick it from the Media Library. See [Image block](https://wordpress.org/documentation/article/image-block/) and [Cover block](https://wordpress.org/documentation/article/cover-block/).\n3. **Featured image or an existing custom field.** In the Post or Page sidebar, click **Set featured image**, pick the file in the Media Library (or upload there), then click **Set featured image**. **Replace** and **Remove** are the later controls. You can also select an Image block and choose **Set as featured image** from **More options**. See [Page/Post settings](https://wordpress.org/documentation/article/page-post-settings-sidebar/). A custom field is a **Name** and a **Value** on the post, saved with **Add Custom Field**. Paste `imageUrl` only into a Name the site already reads as an image URL. Do not invent the Name. See [Custom fields](https://wordpress.org/documentation/article/assign-custom-fields/).\n\nThere is no fourth path in this guide. Do not send a WordPress password or application password to the agent. Do not publish the page or the post during a smoke test. Leave **Status** as **Draft**."},{"id":"architecture","heading":"How it works","markdown":"Architecture, from page brief to a still sitting in WordPress:\n\n1. You store the brand once in Brandiseer (logo and reference visuals teach the look).\n2. The agent host (Cursor or Cowork) has Brandiseer MCP or REST, the Brand ID (`bds_c_...`), and the standing instructions in this guide.\n3. You name the slot: homepage hero, section still, featured image, or OG card. The agent rewrites that brief into subject, layout, and on-image text, then sets `aspectRatio`, `resolution`, `mode`, and `useLogo` as fields.\n4. Brandiseer returns `imageUrl`. The agent reports the URL, the crop, the mode, a one-line alt text suggestion, and a placement note (which page, block, featured image, or custom field). It does not claim wp-admin changed.\n5. A person downloads the file or pastes the URL into an Image block, uploads it to the Media Library, and places it. They leave the page or post as a draft until they have reviewed the still.\n\n![Workflow infographic: brief, Brandiseer still, imageUrl, a person uploads, a person places the image](https://blog.brandiseer.com/use-case-assets/wordpress-site-visuals/workflow-infographic.png)"},{"id":"prerequisites","heading":"What you need","markdown":"- Company website URL, if the brand is not in Brandiseer yet\n- Brandiseer account with at least one finished brand profile\n- API key (`bds_...`) from [Settings → API](https://brandiseer.com/settings/api) or [Developers](https://brandiseer.com/developers)\n- Brand ID (`bds_c_...`) for every brand the agent may call\n- Credits for the stills you actually generate (see the table in Limits & FAQ)\n- Cursor or Claude Cowork, with Brandiseer MCP or a way to call REST\n- A WordPress site you can edit in the block editor\n- Access to **Media > Add New** and to the page or post you will update\n- Permission to upload files. The Media Add New screen prints the host's maximum upload size. Check the downloaded file against that number before you upload\n- Optional: the custom field **Name** the theme or a plugin already uses for an image URL, if that slot is in the brief. Read it from the post. Do not guess it\n\nThis workflow does not need a WordPress application password."},{"id":"setup","heading":"Setup","markdown":"### Stage 1: Add your brand on Brandiseer\n\n1. Go to [brandiseer.com](https://brandiseer.com). In the homepage input, enter your company website URL and click **Try My Brand**.\n2. Wait about one minute while Brandiseer analyses the site and picks a logo and visuals.\n3. Review those visuals carefully. They teach Brandiseer your look. Every later WordPress still is influenced by what you leave here.\n4. Remove anything off-brand (partner logos, stock, irrelevant screenshots). Add page photography that matches the look you want.\n5. Click **Add Brand**, sign up if prompted, then wait about 30 seconds for the brand profile to finish.\n\nAgencies repeat this once per client. Do not point two WordPress sites at one Brand ID.\n\n### Stage 2: API key and Brand ID\n\n1. Open [brandiseer.com/developers](https://brandiseer.com/developers) or [Settings → API](https://brandiseer.com/settings/api).\n2. Create an API key (`bds_...`). Put it in the agent host's secret store. Do not paste it into a WordPress post, a custom field, Slack, or a git repo.\n3. Copy the Brand ID (`bds_c_...`).\n4. 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`.\n5. Optional reachability check, no key required: `GET https://brandiseer.com/api/v1/health` returns `{ \"status\": \"ok\" }`.\n\nRead [guide/docs](https://brandiseer.com/guide/docs) and [guide/image](https://brandiseer.com/guide/image) once while you write the standing instructions. Those pages are the live contract if a field name ever moves.\n\n### Stage 3: Connect Brandiseer to the agent host\n\nUse Cursor or Cowork. One host is enough.\n\n**A. MCP**\n\n1. Add the Brandiseer MCP server at `https://brandiseer.com/api/mcp`.\n2. Authenticate with `Authorization: Bearer` and the API key, in the secret field your host provides.\n3. 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](https://brandiseer.com/guide/docs) documents it.\n\n**B. REST**\n\n1. On [Developers](https://brandiseer.com/developers), open **View Docs** and use **Copy for LLM** if you want the reference inside the session.\n2. 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`.\n3. 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.\n\n### Stage 4: Save the standing instructions\n\n1. Paste the **System prompt** from this guide into the Cursor rule or Cowork instructions that will run site stills.\n2. 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.\n3. Ask the agent to call `brandiseer_list_brands` (or `GET /api/v1/brands`) and confirm the Brand ID exists before the first paid still.\n\n### Stage 5: Smoke test a hero in the block editor\n\n1. Ask for one homepage hero with a layout-only brief (the Spring hero in Example flows).\n2. Confirm the agent checked the brand, avoided colour and mood words, and returned `imageUrl` plus crop, mode, and a placement note. Open the URL in a browser before you place it.\n3. Download the file. Compare its size with the maximum shown on **Media > Add New**. If the file is larger than that host limit, regenerate at `1K` and download again.\n4. Upload it with drag-and-drop or **Select Files**. In the Media Library, open the item and set **Alt Text**. Block-level alt text applies only to that one page. Alt text stored on the attachment is the default when you insert the file again. See the Image block article.\n5. Open a page you are willing to edit and leave **Status** as **Draft**. Add a Cover block with `/cover`. Choose **Media Library** and select the file, or **Upload** the same file. Put the page heading in the Cover's inner text. Leave that region empty on the still. If the Cover crops the frame and **Fixed background** is off, drag the focal point onto the subject. See [Cover block](https://wordpress.org/documentation/article/cover-block/).\n6. Alternative for a still that is not a full-bleed header: add an Image block, choose **Insert from URL**, paste `imageUrl`, press Enter, then click **Upload to Media Library**. If **Insert from URL** fails, the Image block article says some sites block embedding. Download the file and use **Upload** or **Media Library** instead.\n7. Add alt text in the block's **Content** tab, or mark the image decorative only when it carries no information. Click **Save draft**. Do not click **Publish**.\n8. 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.\n\n### Stage 6: Featured image\n\nSkip this stage unless the brief is a featured image or an OG card you are placing through the featured image.\n\nThe [Page/Post settings](https://wordpress.org/documentation/article/page-post-settings-sidebar/) article says featured images (also called post thumbnails) are used in different ways depending on the theme. Many themes use the image to showcase the post on the home page or the blog index. The Learn WordPress tutorial [How to use featured images](https://learn.wordpress.org/tutorial/32894-2/) says a featured image is how you pick which image appears when someone shares the post or page, and that plugins can refine the social image further. Core's editor articles do not document a separate Open Graph image control. If the site already has a plugin field for a different social image, use that plugin's own screen. This guide does not name plugin endpoints.\n\n1. Work on a draft post or page.\n2. Upload the still in **Media > Add New** if it is not in the library yet.\n3. In the Post or Page sidebar, click **Set featured image**, select the file, and click **Set featured image**. You can also drag a file from your computer into the featured image box on that panel.\n4. Or select an Image block that already uses a library file and choose **Set as featured image** under **More options** (the three dots). See [Image block](https://wordpress.org/documentation/article/image-block/).\n5. The [Post Featured Image block](https://wordpress.org/documentation/article/post-featured-image-block/) displays that choice inside a template or a query loop. It does not upload a file. Add it in the site editor only when you are changing how the theme shows the image, and only on a template you are willing to edit.\n6. Click **Save draft**. Use **Replace** later if the still is wrong. Do not publish from this smoke test.\n\nFor an OG card, generate at `16:9`. Brandiseer has no 1.91:1 ratio. Crop in the Media Editor (**Crop** on the Image block or Cover block) if the preview needs a tighter frame. WordPress saves that edit as a new file and keeps the original in the Media Library.\n\n### Stage 7: Custom field that already stores an image URL\n\nSkip this stage unless the brief names a custom field the site already uses.\n\nWordPress documents custom fields as extra metadata on a post: a **Name** and a **Value**, saved with **Add Custom Field**. The [custom fields article](https://wordpress.org/documentation/article/assign-custom-fields/) shows that with text examples. Displaying the value is theme work (`the_meta()`, `get_post_meta()`, or `get_post_custom_values()`). Core does not turn that value into a hero by itself.\n\n1. If the custom fields panel is missing, open **Preferences** from the three-dot menu in the editor. The [Preferences](https://wordpress.org/documentation/article/preferences/) article says the General tab has an Advanced section that adds extra areas to the editor. Use the label on your screen. The Page/Post settings article says Preferences is how you choose which sidebar sections appear.\n2. Select the **Name** the site already uses. If you need a new Name, stop and ask the person who owns the theme. Do not invent one in this guide.\n3. Paste `imageUrl` into **Value** only when that Name is already defined as a URL. If the field expects an attachment ID, upload the file first and use the ID WordPress shows on the attachment. Do not put the Brandiseer URL into an ID field.\n4. Click **Add Custom Field** (or update the existing value) and save the draft. Do not publish."},{"id":"prompting-rules","heading":"Prompting rules for Brandiseer images","markdown":"When the agent builds `prompt`:\n\n- Keep subject, layout, composition, and on-image text (what the words say and where they sit).\n- Never send brand colours, fonts, mood, or visual style. Brand memory already applies those. Style words fight the brand and produce off-brand stills.\n- Put crop in `aspectRatio`, quality in `mode`, pixel size in `resolution`, and logo on/off in `useLogo`. Those are body fields, not prompt prose.\n- Map the WordPress slot to a documented Brandiseer ratio. Homepage hero and full-bleed section: `16:9`. Featured image: `16:9`, `4:3`, or `1:1`, matching the theme crop the human names. OG card: `16:9`. Portrait site slots: `9:16`. Brandiseer does not offer a 1.91:1 OG ratio. Crop in WordPress if the slot is tighter than 16:9.\n- Prefer `design` for finished site stills. `fast` is the API default if you omit `mode`, and it is the right fallback if a design job fails once.\n- Prefer `2K`. Drop to `1K` when the file would miss the maximum upload size shown on Media Add New. `4K` is optional and easier to reject on a small host limit.\n- Set `useLogo` true only when the brief asked for a logo (or your default says so). Headings that a Cover block or a theme title will render should stay off the image. Say \"empty region\" for that area instead of describing a font.\n- Full rules: [Prompt compatibility](https://brandiseer.com/guide/image)."},{"id":"system-prompts","heading":"System prompt","markdown":"Paste this into Cursor or Cowork as the standing instructions for WordPress site stills. Replace the placeholders before the first generate.\n\n```text\nYou generate on-brand heroes, section stills, featured images, and OG cards\nfor a WordPress site. Brandiseer returns an image URL. You do not push\npixels into WordPress, and you do not publish the site.\n\nBrandiseer:\n- MCP: https://brandiseer.com/api/mcp with Authorization: Bearer.\n  Tools you may call: brandiseer_list_brands, brandiseer_check_credits,\n  brandiseer_generate_image. Do not invent tool names.\n- REST: X-API-Key: bds_... (secret store only).\n  Prefer POST https://brandiseer.com/api/v2/generate\n  or POST https://brandiseer.com/api/v2/generate/async\n  then poll GET https://brandiseer.com/api/v2/jobs/:jobId every 3 to 5 seconds\n  until data.status is done or failed, or about 10 minutes have passed.\n- Live contract: https://brandiseer.com/guide/docs and\n  https://brandiseer.com/guide/image\n\nDefaults for this site (fill in once):\n- Brand ID: bds_c_...\n- Hero and section aspectRatio: 16:9\n- Featured image aspectRatio: ask if the theme crop is not known (16:9, 4:3, or 1:1)\n- OG card aspectRatio: 16:9 (there is no 1.91:1 Brandiseer ratio)\n- mode: design\n- resolution: 2K (use 1K if the host upload limit is in play)\n- useLogo when the brief is silent: false\n- Multi-brand map, if any: brand name to bds_c_...\n\nOn every request:\n1. Resolve brandId from the brief or the default. If more than one brand\n   exists and the brief does not name one, ask. Never fall through to\n   another client's Brand ID.\n2. Check credits before a batch (brandiseer_check_credits or\n   GET https://brandiseer.com/api/v1/credits). A single still can proceed\n   if the last known balance covers the mode and resolution in the table\n   you were given. On 402, stop.\n3. Rewrite the brief into subject, layout, composition, and on-image text.\n   Strip colours, fonts, mood, and visual style. If stripping leaves no\n   physical subject, ask what is in the frame. Do not generate.\n4. Choose aspectRatio from the slot. Put resolution, mode, and useLogo in\n   API fields, not in the prompt. Do not invent a theme pixel size.\n5. Generate one still. Return imageUrl, aspectRatio, mode, resolution,\n   useLogo, a one-line alt text suggestion, and a placement note:\n   Cover or Image block on a named draft page, featured image on a named\n   draft post, or the custom field Name the human already uses.\n6. Do not tell the user the WordPress site changed unless they confirm\n   they placed the file. Do not publish a page or a post.\n\nWordPress placement is human only:\n- Media: Media > Add New, drag-and-drop or Select Files. The screen shows\n  the host maximum upload size. Uploading does not place the file.\n- Image block: Upload, Media Library, or Insert from URL then Upload to\n  Media Library. If Insert from URL fails, the person downloads the file.\n- Cover block: Upload or Media Library. The heading stays in the Cover's\n  inner text when the brief says the page will set it.\n- Featured image: Set featured image in the Post or Page sidebar, or\n  Set as featured image on an Image block. Core has no separate OG field.\n  An OG card is placed as the featured image unless the human names\n  another field their site already has.\n- Custom fields: paste into the Value of a Name the human already uses.\n  Do not invent the Name.\n- Do not call the WordPress REST API. Do not invent API paths. Do not ask\n  for a WordPress password or application password.\n\nOut of scope:\n- Slack replies, Buffer scheduling, and Zapier, Make, or n8n scenarios.\n- Webflow site placement, HubSpot files or ads, Klaviyo email placement,\n  and Shopify product placement.\n- Theme code, plugin code, and new custom field names.\n- Legal approval of claims, prices, or offers printed on the image.\n- GET https://brandiseer.com/api/v1/usage (browser session only).\n```\n\n\n### Prompt rewriter\n\nUse 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.\n\n```javascript\n// Local rewriter for a Cursor or Cowork helper script.\n// Keeps subject, layout, composition, and on-image text.\n// Strips colour, type, mood, and visual-style language.\n\nconst STYLE_WORDS =\n  /\\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;\n\nconst SLOT_TO_RATIO = {\n  hero: \"16:9\",\n  homepage: \"16:9\",\n  banner: \"16:9\",\n  section: \"16:9\",\n  cover: \"16:9\",\n  background: \"16:9\",\n  \"16:9\": \"16:9\",\n  featured: \"16:9\",\n  og: \"16:9\",\n  \"open graph\": \"16:9\",\n  card: \"4:3\",\n  \"4:3\": \"4:3\",\n  square: \"1:1\",\n  \"1:1\": \"1:1\",\n  portrait: \"9:16\",\n  \"9:16\": \"9:16\",\n};\n\nfunction rewriteBrandiseerPrompt(input) {\n  const headline = String(input.headline || \"\").trim();\n  const subject = String(input.subject || input.brief || \"\").trim();\n  const slotKey = String(input.slot || input.crop || \"\").trim().toLowerCase();\n  const aspectRatio = SLOT_TO_RATIO[slotKey] || \"\";\n\n  let prompt = [subject, headline ? `On-image text: \"${headline}\".` : \"\"]\n    .filter(Boolean)\n    .join(\" \");\n\n  prompt = prompt\n    .replace(/#[0-9a-f]{3,8}\\b/gi, \" \")\n    .replace(STYLE_WORDS, \" \")\n    .replace(/\\s+/g, \" \")\n    .trim();\n\n  return {\n    prompt,\n    aspectRatio,\n    needsSubject: prompt.length < 12 || !aspectRatio,\n  };\n}\n```\n\nIf `needsSubject` is true, ask the human for a subject and a slot. Do not POST.\n\nThe `featured` key above defaults to `16:9` only so a named featured-image brief can proceed. If the human has not confirmed the theme crop, ask before you generate. A square or 4:3 card needs an explicit slot."},{"id":"add-ons","heading":"Add-ons","markdown":"Add these after the hero smoke test passes. They do not change Brandiseer's image contract, and they do not give Brandiseer a publish button.\n\n### Approval before publish\n\nAfter `imageUrl` is in the Media Library and on the draft, a named reviewer checks the still, the alt text, and the heading that sits in the Cover. Only then may someone change **Status** away from **Draft** and publish. The Page/Post settings article lists **Draft** as the status for a page or post that is not ready to be published. Until that review, leave the live page on its current version. Brandiseer does not approve legal claims, prices, or offers.\n\n### One brand per WordPress site\n\nKeep a table: site name and `bds_c_...`. Require a site name on every brief when more than one site exists. If the name misses, stop and list the sites you configured. Confirm Brand IDs with `GET /api/v1/brands`. Never fall through to another client's Brand ID. There is no WordPress password in this table, because this guide does not call WordPress.\n\n### Credit soft-limit\n\nWhen `credits` is under a threshold you choose (for example 40), switch new site 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.\n\n### Placement log\n\nKeep a short note next to the work: site, page or post, slot, `brandId`, `mode`, `aspectRatio`, `resolution`, `imageUrl`, and whether it was uploaded, pasted with **Insert from URL**, set as the featured image, or stored in a custom field. Brandiseer does not write this log. WordPress does not send it back to Brandiseer.\n\n### Handoff to the sibling guides\n\n- Stills requested in Slack, returned in a thread: [Slack creative desk](/use-cases/slack-creative-desk).\n- Captions and a Buffer schedule: [Social media automation](/use-cases/social-media-automation).\n- A Zapier, Make, or n8n trigger that should deliver `imageUrl` on a schedule: [Always-on creative automation](/use-cases/always-on-creative-automation).\n- A homepage hero that lives in Webflow: [Webflow site visuals](/use-cases/webflow-site-visuals).\n- An email header, landing page, or ad that lives in HubSpot: [HubSpot campaign creatives](/use-cases/hubspot-campaign-creatives).\n- An email hero that lives in Klaviyo: [Klaviyo email heroes](/use-cases/klaviyo-email-heroes).\n- A product still that lives in Shopify: [Shopify product visuals](/use-cases/shopify-product-visuals).\n\nDo not embed Buffer, a Slack desk, an always-on scenario, Webflow, HubSpot, Klaviyo, or Shopify inside this WordPress guide.\n\n### Optional motion (not the site MVP)\n\nThe Cover block can use a video background, and it documents a poster image for that video. This guide does not generate that video file and does not publish it.\n\nBrandiseer 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 a different contract from image jobs (`done` and `imageUrl`). Read [guide/video](https://brandiseer.com/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 publish the page from this guide."},{"id":"limits-and-faq","heading":"Limits & FAQ","markdown":"### Does Brandiseer update WordPress or publish the site?\n\nNo. Brandiseer returns `imageUrl`. A person uploads that file on **Media > Add New**, places it in an Image block or a Cover block, sets a featured image, or pastes the URL into a custom field the site already uses. Publishing stays in WordPress, after a person reviews the still.\n\n### Is there a Brandiseer plugin inside WordPress?\n\nNo. There is no Brandiseer block in the inserter in this guide. Do not look for a native \"send to WordPress\" button on the Brandiseer side.\n\n### What if WordPress rejects the image?\n\nThe hard ceiling is the maximum upload size printed on [Media Add New](https://wordpress.org/documentation/article/media-add-new-screen/). That number comes from the host. This guide does not invent a megabyte cap. [Image size and quality](https://wordpress.org/documentation/article/image-size-and-quality/) names `jpg`, `gif`, and `png` as the common web image types and treats file size as a loading concern. If the uploader rejects the file, download it, export a JPEG or PNG under the size on that screen, and upload again.\n\n**Insert from URL** can fail even when the file is valid. The Image block article says the option may not work with every image or website, because some sites block embedding. Download the file and use **Upload** or **Media Library**.\n\nAfter **Insert from URL**, click **Upload to Media Library**. The same article says an image left only on the remote address can stop displaying if that file is moved or no longer shared.\n\n### Which WordPress actions are in this guide?\n\nOnly human steps confirmed on WordPress.org's public articles:\n\n- **Media > Add New**: drag-and-drop or **Select Files**, then **Edit** or **Copy URL to clipboard**, on [Media Add New](https://wordpress.org/documentation/article/media-add-new-screen/).\n- Media Library attachment details, including **Alt Text** and **File URL**, on [Media Library](https://wordpress.org/documentation/article/media-library-screen/).\n- Image block: **Upload**, **Media Library**, **Insert from URL**, **Upload to Media Library**, alt text, and **Set as featured image**, on [Image block](https://wordpress.org/documentation/article/image-block/).\n- Cover block: **Upload**, **Media Library**, **Use featured image**, focal point, and inner text, on [Cover block](https://wordpress.org/documentation/article/cover-block/).\n- Featured image: **Set featured image**, **Replace**, and **Remove**, on [Page/Post settings](https://wordpress.org/documentation/article/page-post-settings-sidebar/).\n- Display of that image in a template: [Post Featured Image block](https://wordpress.org/documentation/article/post-featured-image-block/).\n- Custom fields: **Name**, **Value**, and **Add Custom Field**, on [Custom fields](https://wordpress.org/documentation/article/assign-custom-fields/).\n\nThis guide does not call the WordPress REST API and does not publish the site.\n\n### What does the REST reference actually list?\n\nRead these pages before anyone automates a later step. This guide does not call them.\n\nOn [Media](https://developer.wordpress.org/rest-api/reference/media/) (reference page last updated 16 January 2024):\n\n- `GET /wp/v2/media` lists media.\n- `POST /wp/v2/media` creates a media item. The arguments on that page are metadata such as `title`, `alt_text`, `caption`, `description`, and `post`. `source_url` is in the schema as the URL of the stored file, and it is read only. It is not a field you send to upload a remote image.\n- `GET /wp/v2/media/<id>` retrieves one item.\n- `POST /wp/v2/media/<id>` updates one item, including `alt_text`.\n- `DELETE /wp/v2/media/<id>` deletes one item. `force` bypasses Trash.\n\nThe [attachments controller reference](https://developer.wordpress.org/reference/classes/wp_rest_attachments_controller/) documents two upload shapes that the handbook page above does not spell out: raw body data, which requires a `Content-Disposition` header formatted as ``attachment; filename=\"image.png\"`` or similar, and `multipart/form-data`. The same class documents an optional `url` argument on create, since WordPress 7.1.0: a publicly reachable HTTP or HTTPS image URL to sideload, instead of uploading a file. The controller derives the filename from the URL path and rejects the request when that name is missing or is not an image type. A Brandiseer `imageUrl` often has no image extension, so that argument can reject it. Do not point this workflow at `url`. Download the file and upload it.\n\nOn [Posts](https://developer.wordpress.org/rest-api/reference/posts/), `featured_media` is an integer media ID. It is not a URL. Setting it is outside this guide.\n\nDo not invent a \"set the Cover background\" route. Do not send WordPress credentials to the agent.\n\n### Can the agent use a WordPress MCP or application password?\n\nNo. This workflow has no WordPress credential. If a host offers a WordPress connector, leave it disconnected for this guide. Brandiseer still only returns the still. A person places it.\n\n### Where does the key live?\n\nOnly the Brandiseer key (`bds_...`) is in play. It lives in the agent host's secret store. Never in a post, a custom field, a Slack message, a prompt you commit, or a git repo. Rotate it if it leaks. Poll a Brandiseer job with the same key that submitted it.\n\n### What do stills cost?\n\nCredits per still. Failures refund. Async submits deduct immediately and refund if the job fails.\n\n| Mode | 1K | 2K | 4K |\n| --- | --- | --- | --- |\n| Fast | 4 | 6 | 8 |\n| Design | 5 | 6 | 8 |\n| Pro | 6 | 8 | 10 |\n\n`402` means not enough credits. Pricing context: [brandiseer.com/pricing](https://brandiseer.com/pricing).\n\n### Why is the still off-brand?\n\nAlmost always because the prompt contained colours, fonts, mood, or visual style. Strip them and generate again. See [guide/image](https://brandiseer.com/guide/image).\n\nThe Image block and Cover block can also apply a duotone filter. That recolour is a WordPress control. Leave it off when you want the Brandiseer still to stay as generated.\n\n### Why does the crop look wrong on the page?\n\nBrandiseer aspect ratios are `1:1`, `16:9`, `9:16`, and `4:3`. Themes and Cover blocks crop featured images and heroes. Generate the hero and the OG card at `16:9`, then set a focal point on the Cover or crop in the Media Editor. Do not ask Brandiseer for a custom pixel size inside the prompt.\n\n### How long can I poll?\n\nAbout 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.\n\n### Which generate URL should new site work use?\n\n`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.\n\n### Does the agent approve claims on the image?\n\nNo. If the still has a price, a discount, or a legal line, a person reads it before that page is published. Brandiseer does not review the claim.\n\n### Does uploading to the Media Library publish the page?\n\nNo. **Media > Add New** stores the file. Assignment to a block, a featured image, or a custom field is a later human step. **Save draft** stores the edit without publishing. Publish is a separate control."},{"id":"demo","heading":"Demo / motion","markdown":"**Motion brief only. This is not an embed, and there is no walkthrough URL yet.**\n\n**Working title:** WordPress site visuals\n**Length:** 45 to 75 seconds\n\n**Story beats:**\n\n1. A person asks Cursor or Cowork for a homepage hero with a layout-only brief\n2. The agent calls Brandiseer (MCP or REST v2) and shows an on-brand still\n3. `imageUrl` is uploaded on Media Add New and placed on a Cover block, still a draft\n4. Optional cut: the same kind of still is set as the featured image, still unpublished\n5. A human reviews alt text and leaves publish for a later step\n\n**On screen:** the agent transcript with the prompt (no colour or mood words), one finished still, and the WordPress Cover block. Blur the Brandiseer API key. Do not show a published page, and do not show a fake video player in the guide."},{"id":"additional-1-example-flows","heading":"Example flows","markdown":"### Flow A: Homepage hero, placed on a draft Cover\n\nThe brief: \"Homepage hero. Product on the left. Leave the right half empty. The Cover heading will sit there. No logo on the image.\"\n\nThe 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 product on the left of a wide hero\". You open the URL, download it, upload it on **Media > Add New**, and select it as the Cover background on a draft page. You type the heading in the Cover. You save the draft. You publish later, after the heading and spacing look right.\n\n### Flow B: Section stills for one landing page\n\nThe brief lists three sections: product row, quote band, and closing band. Each one says what is in the frame and which region must stay empty for a heading. The agent generates three stills, all `16:9`, and labels them with the section name. You upload three files and bind each one to its Cover or Image block. Three Design 2K stills cost 18 credits if all succeed. Failures refund.\n\n### Flow C: Featured image on a draft post\n\nThe brief: \"Featured image for the spring notes post. One product, centred, full item in frame. No words on the image. The theme uses a wide crop.\"\n\nThe agent uses `16:9` because the brief named a wide crop. You upload the file, click **Set featured image**, and save the draft. You do not publish. If the theme crop is unknown, the agent asks before it generates.\n\n### Flow D: OG card\n\nThe brief: \"Share image for the spring launch page. Product left of centre. On-image text Spring launch on the right.\"\n\nThe agent uses `16:9`, not a 1.91:1 crop, and says so in the placement note. You set that file as the featured image, which is the core control this guide uses for the share image. If the site already stores a different social image in a named custom field, you paste `imageUrl` into that existing **Value** and still do not publish.\n\n### Flow E: Credit check before a page set\n\nBefore Flow B, the agent calls `brandiseer_check_credits` or `GET https://brandiseer.com/api/v1/credits` and reads `credits`. Three Design 2K stills need 18 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.\n\n### Flow F: Style-only brief\n\nThe brief: \"Make the hero feel premium and moody.\"\n\nThe agent does not generate. It asks which 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."},{"id":"additional-2-related-use-cases","heading":"Related use cases","markdown":"- [Shopify product visuals](/use-cases/shopify-product-visuals): on-brand product stills placed in Shopify by a person\n- [Klaviyo email heroes](/use-cases/klaviyo-email-heroes): on-brand email heroes placed in Klaviyo by a person\n- [HubSpot campaign creatives](/use-cases/hubspot-campaign-creatives): on-brand stills placed in HubSpot emails, landing pages, and ads\n- [Webflow site visuals](/use-cases/webflow-site-visuals): on-brand stills placed in Webflow Assets or CMS image fields\n- [Always-on creative automation](/use-cases/always-on-creative-automation): Zapier, Make, or n8n calls Brandiseer REST and delivers `imageUrl` downstream\n- [Slack creative desk](/use-cases/slack-creative-desk): people request stills in Slack and get them back in-thread\n- [Social media automation](/use-cases/social-media-automation): on-brand images, captions, and Buffer scheduling"},{"id":"additional-3-links","heading":"Links","markdown":"| Resource | URL |\n| --- | --- |\n| Brandiseer | https://brandiseer.com |\n| Developers | https://brandiseer.com/developers |\n| API reference (guide/docs) | https://brandiseer.com/guide/docs |\n| Image prompt compatibility | https://brandiseer.com/guide/image |\n| Video prompting (optional motion) | https://brandiseer.com/guide/video |\n| MCP endpoint (agent hosts) | https://brandiseer.com/api/mcp |\n| API keys | https://brandiseer.com/settings/api |\n| Pricing / credits | https://brandiseer.com/pricing |\n| WordPress | https://wordpress.org |\n| Image block | https://wordpress.org/documentation/article/image-block/ |\n| Cover block | https://wordpress.org/documentation/article/cover-block/ |\n| Media Add New | https://wordpress.org/documentation/article/media-add-new-screen/ |\n| Media Library | https://wordpress.org/documentation/article/media-library-screen/ |\n| Page/Post settings | https://wordpress.org/documentation/article/page-post-settings-sidebar/ |\n| Post Featured Image block | https://wordpress.org/documentation/article/post-featured-image-block/ |\n| Custom fields | https://wordpress.org/documentation/article/assign-custom-fields/ |\n| Preferences | https://wordpress.org/documentation/article/preferences/ |\n| Image size and quality | https://wordpress.org/documentation/article/image-size-and-quality/ |\n| How to use featured images | https://learn.wordpress.org/tutorial/32894-2/ |\n| REST media | https://developer.wordpress.org/rest-api/reference/media/ |\n| REST posts | https://developer.wordpress.org/rest-api/reference/posts/ |\n| REST attachments controller | https://developer.wordpress.org/reference/classes/wp_rest_attachments_controller/ |\n| Visual pack manifest | `assets/MANIFEST.md` |\n| Sibling: Shopify product visuals | https://blog.brandiseer.com/use-cases/shopify-product-visuals |\n| Sibling: Klaviyo email heroes | https://blog.brandiseer.com/use-cases/klaviyo-email-heroes |\n| Sibling: HubSpot campaign creatives | https://blog.brandiseer.com/use-cases/hubspot-campaign-creatives |\n| Sibling: Webflow site visuals | https://blog.brandiseer.com/use-cases/webflow-site-visuals |\n| Sibling: Always-on creative automation | https://blog.brandiseer.com/use-cases/always-on-creative-automation |\n| Sibling: Slack creative desk | https://blog.brandiseer.com/use-cases/slack-creative-desk |\n| Sibling: Social media automation | https://blog.brandiseer.com/use-cases/social-media-automation |"},{"id":"additional-4-source","heading":"Source","markdown":"Public Use case README for WordPress site visuals. Brandiseer MCP and REST v2 image generation from Cursor or Claude Cowork, then a person places `imageUrl` in the WordPress Media Library, the block editor, the featured image, or an existing custom field. Aligned with [guide/docs](https://brandiseer.com/guide/docs) and [guide/image](https://brandiseer.com/guide/image) (23 September 2026). WordPress placement steps follow the public articles linked above. Brandiseer does not push into WordPress and does not publish the site. Distinct from Slack creative desk, Buffer social scheduling, Zapier, Make, or n8n always-on HTTP, Webflow site visuals, HubSpot campaign creatives, Klaviyo email heroes, and Shopify product visuals."},{"id":"api-reference","heading":"API reference","markdown":"Wiring reference for agents and HTTP modules. The sections above are the human path.\n\n### MCP (interactive stills in Cursor or Cowork)\n\nConnect `https://brandiseer.com/api/mcp` with `Authorization: Bearer` and the API key. The only Brandiseer tools this guide uses are:\n\n- `brandiseer_list_brands`\n- `brandiseer_check_credits`\n- `brandiseer_generate_image`\n\nDo 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 WordPress.\n\n### REST (prefer v2 images)\n\nSend `X-API-Key: bds_...` on every authenticated Brandiseer call. There is no official SDK. Any HTTP client the agent host can run is enough.\n\n| Call | What you get |\n| --- | --- |\n| `POST https://brandiseer.com/api/v2/generate` | Sync still. `200` body `{ \"imageUrl\", \"creditsUsed\" }`. Design mode often takes 40 to 70 seconds. |\n| `POST https://brandiseer.com/api/v2/generate/async` | `202` body `{ \"data\": { \"jobId\" } }` (ids look like `bds_job_...`). Credits are deducted when you submit. |\n| `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. |\n| `POST https://brandiseer.com/api/v1/generate` | Legacy only. `proMode` boolean. Fast and Pro only. Prefer v2. |\n| `GET https://brandiseer.com/api/v1/credits` | JSON includes `credits`, the current balance for that key. |\n| `GET https://brandiseer.com/api/v1/brands` | Brands for the key. Each brand `id` looks like `bds_c_...`. |\n| `GET https://brandiseer.com/api/v1/health` | `{ \"status\": \"ok\" }`. No API key. |\n\nImage 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`.\n\nSync 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.\n\nDone job body: `{ \"data\": { \"status\": \"done\", \"imageUrl\", \"creditsUsed\", \"referenceImage\" } }`. Hand `data.imageUrl` to the person placing it in WordPress. Failed job body: `{ \"data\": { \"status\": \"failed\", \"error\": { \"code\", \"message\" } } }`.\n\nCursor 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 WordPress at the Brandiseer MCP URL.\n\n### Field mapping\n\n| Incoming field | API | Rule |\n| --- | --- | --- |\n| Slot (hero, section, featured, OG) | `aspectRatio` | Hero and section: `16:9`. Featured: `16:9`, `4:3`, or `1:1` once the theme crop is known. OG: `16:9`. Portrait: `9:16`. |\n| headline | inside `prompt` only | On-image text and placement. Not a separate body field. Leave it out when a Cover block or the theme title will set the headline. |\n| brandId | `brandId` | `bds_c_...`. Required. |\n| mode | `mode` | `fast`, `design`, or `pro`. Omit and the API uses `fast`. Prefer `design` for site stills. |\n| useLogo | `useLogo` | `true` or `false`. |\n| subject or brief | `prompt` | After the rewriter. If the cleaned text has no subject, do not call Brandiseer. |\n| resolution | `resolution` | `1K`, `2K`, or `4K`. Prefer `2K`. Drop to `1K` if the file would miss the host upload limit. |\n\n### Example JSON\n\nUse this body for both sync and async. Only the URL and the response change.\n\n```json\n{\n  \"brandId\": \"bds_c_...\",\n  \"prompt\": \"Wide homepage hero. Product centred on the left third. Empty right half for a heading the page will set in a Cover block. No on-image text.\",\n  \"aspectRatio\": \"16:9\",\n  \"resolution\": \"2K\",\n  \"mode\": \"design\",\n  \"useLogo\": false\n}\n```\n\nSync: `POST https://brandiseer.com/api/v2/generate`. A Design 2K still costs 6 credits, so a success body looks like:\n\n```json\n{\n  \"imageUrl\": \"https://...\",\n  \"creditsUsed\": 6\n}\n```\n\nAsync: `POST https://brandiseer.com/api/v2/generate/async`. HTTP `202`:\n\n```json\n{\n  \"data\": {\n    \"jobId\": \"bds_job_...\"\n  }\n}\n```\n\nPoll `GET https://brandiseer.com/api/v2/jobs/bds_job_...` with the same `X-API-Key`. When it finishes:\n\n```json\n{\n  \"data\": {\n    \"status\": \"done\",\n    \"imageUrl\": \"https://...\",\n    \"creditsUsed\": 6,\n    \"referenceImage\": null\n  }\n}\n```\n\nWhen it fails (credits are refunded):\n\n```json\n{\n  \"data\": {\n    \"status\": \"failed\",\n    \"error\": {\n      \"code\": \"...\",\n      \"message\": \"...\"\n    }\n  }\n}\n```\n\nIgnore `referenceImage` for delivery. WordPress gets `imageUrl` (or a file you downloaded from it), uploaded or pasted by a person.\n\nSlot prompts that stay layout-only:\n\n| Slot | aspectRatio | Prompt |\n| --- | --- | --- |\n| Homepage hero | `16:9` | Wide homepage hero. Product centred on the left third. Empty right half for a heading the page will set in a Cover block. No on-image text. |\n| Section still | `16:9` | Full-bleed section background. Product cluster along the bottom edge. Upper two thirds empty for a heading. No on-image text. |\n| Featured image | `16:9` | Landscape featured image. Single subject centred, full item in frame. Plain surrounding space. No on-image text. |\n| OG card | `16:9` | Landscape share image. Subject left of centre. On-image text: \"Spring launch\" in the right third. |"}],"actions":{"tryBrandiseer":"https://brandiseer.com","createApiKey":"https://brandiseer.com/settings/api","developerDocs":"https://brandiseer.com/developers","mcpEndpoint":"https://brandiseer.com/api/mcp"},"representations":{"html":"https://blog.brandiseer.com/use-cases/wordpress-site-visuals","markdown":"https://blog.brandiseer.com/use-cases/wordpress-site-visuals/agent.md","json":"https://blog.brandiseer.com/use-cases/wordpress-site-visuals/guide.json"}}