BrenzuriStart free
House-style illustrations
Guides

House-style illustrations

A style is learned once, confirmed by a person, and never re-derived per article.

On this page

Brenzuri can put a picture on an article in the visual style of the site it is written for. The picture is generated, always labelled as such, and never claims to show a real person, place or logo.

How a style is learned#

  1. At the site read, Brenzuri collects up to six pictures from the site’s own pages, on the site’s own domain only, and asks one vision model what they have in common: a one-sentence description, up to six hex colours, a caption pattern such as Plate {n} - {topic}, and a confidence.
  2. The result is a draft. Nothing is drawn from a draft.
  3. A person confirms it. An Owner or Editor confirms, edits, turns off or discards the style in Setup › Illustration style. Only then is it used.
  4. It is not re-derived per article. Reading the site again proposes a new draft beside the confirmed style and never overwrites it.

A site without a confirmed style gets the generic style: abstract editorial, two or three muted colours, flat shapes.

curl "$BRENZURI_URL/api/v1/sites/$SITE_ID/house-style" \
  -H "Authorization: Bearer $BRENZURI_KEY"

When a picture is made#

  • A brief with illustration: "generate" adds the illustrate step to the job. It is optional: if it fails it can be skipped and the article still finishes.
  • A column of a site with a confirmed style asks for an illustration; the site brief page offers it under the same condition.
  • A Beat’s articles are written without one.
  • The step has a budget of 150 seconds. If it cannot finish inside it, the step is skipped and says why.
  • Making a picture costs no credits.

A brief with illustration: "generate" for a site with no confirmed style gets a picture in the generic style.

What an article carries#

JSON
{
  "id": "b7d1f4a2-3c58-4e90-a6b1-5f08c2e9d374",
  "status": "ready",
  "url": "/api/v1/articles/9f3b1c2a-6d4e-4b7a-8c15-2e0a7d91b3f4/illustration?i=b7d1f4a2-3c58-4e90-a6b1-5f08c2e9d374",
  "altText": "Flat shapes of a ferry crossing a calm blue strait under a pale sky.",
  "caption": "Plate 4 - Ferry timetables",
  "label": "AI-generated",
  "styleLabel": "House style",
  "regenerating": false,
  "regenerationsLeft": 4
}
illustration on an article. It is absent when the article has none.
FieldNotes
statusready, skipped, generating or failed. url exists only when ready.
labelAlways AI-generated.
styleLabelHouse style or Abstract editorial: which style made it.
captionFrom the site’s caption pattern when it has {topic}, at most 200 characters; otherwise the topic. A {n} plate number counts up per style, and a regenerated picture keeps its plate number while the style is the same.
altTextWritten for the picture.

Fetch the image with GET on url, using the same key. The label in exports is one of two sentences, depending on the style: “AI-generated, in the site’s house style. No real people, places or logos.” or “AI-generated, abstract editorial. No real people, places or logos.”

Every picture is made with a prompt that forbids text, letters, numbers, logos, watermarks, real identifiable people and recognisable real places, and names found in the article are replaced in the scene description.

Ask for a new picture#

POST /articles/{id}/illustration/regenerate needs an API key with the edit scope. It is an ordinary edit, like adding a source. It is not an MCP tool. It replaces a picture the article already has; an article that has never had one answers 409 no_illustration.

curl -X POST "$BRENZURI_URL/api/v1/articles/$ARTICLE_ID/illustration/regenerate" \
  -H "Authorization: Bearer $BRENZURI_KEY"

The answer is 202 and the whole article, with illustration.regenerating: true. The new picture is made after the response. Read the article until illustration.regenerating is false.

const url = `${process.env.BRENZURI_URL}/api/v1/articles/${articleId}`;
const headers = { Authorization: `Bearer ${process.env.BRENZURI_KEY}` };

await fetch(`${url}/illustration/regenerate`, { method: 'POST', headers });

let article;
do {
  await new Promise((r) => setTimeout(r, 3000));
  article = await (await fetch(url, { headers })).json();
} while (article.illustration?.regenerating);

console.log(article.illustration?.status, article.illustration?.lastFailure ?? '');
LimitValue
Per article5 new pictures a day
Per workspace50 a day, and 2 being made at once
CountedPer UTC day, failed tries included. Rewriting an article does not reset it.
CostFree
  • The new picture is a new version, Illustration regenerated, and it names the key. An approved article goes back to needsReview, and the label with it.
  • An article that has never had a picture: 409 no_illustration. A language version never has one, so asking for a new picture of a version answers the same.
  • A Beat’s article keeps the picture it was written with: 409 beat_article.
  • Only one at a time per article: 409 illustration_regenerating.
  • If this deployment has no image service, GET /sites/{siteID}/house-style says enabled: false and regenerating answers 503 illustrations_off.

In exports and on your site#

WhereThe pictureThe label
MarkdownNot embeddedIllustration line and caption, from the exported version
PDFEmbedded, with its alt textYes
DOCXNot embeddedIllustration line and caption
WordPressFeatured image, with alt text and a caption saying it is AI-generatedIn the caption
A custom siteInside the signed body as illustrationlabel and styleLabel

How the picture reaches a site is in Deliver to WordPress and Deliver to a custom site.

Which model draws it#

The image models are set by the deployment, never by a model’s own choice. Two small language-model tasks, reading the style and planning the scene, are routed like every other model task.