---
title: "Statics"
description: "What a static ad is in roasOS: one product, two lanes, and the brand kit rendered into the image."
url: https://docs.roasos.com/concepts/statics
---

# Statics

A **static** is one image that sells one product. It carries the product, a headline, a sub-head and a call to action. It is the unit that a paid social account buys most.

roasOS makes statics with one door: [`POST /v1/workflows/statics`](/workflows/make-static-ads). The door starts an agent run. The run plans the set, prices it on one card, and then renders each variant as an ordinary image job.

A static is not a new model family. Each render inside the run is a normal paid generation on a model that this catalog already lists.

## One product, one run

A statics run holds exactly one product. `product_id` is required, because a static ad without a product is not a static ad.

roasOS resolves the product to its [product kit](/concepts/product-kits) before the run starts. A statics run takes three shots from the kit: the hero, one detail shot that carries the label, and one shot of the product held or turned. Inside each of those three choices roasOS prefers a `verified` shot over an unverified one.

A workspace with no kit yet is not blocked. The run then uses the raw photos of the product.

To make a second product, start a second run.

## The two lanes

`lane` chooses how the image is built. The default is `scene`.

| Lane      | How the image is made                                                                                      | Model                                                     |
| --------- | ---------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
| `scene`   | roasOS renders the whole frame in one call, with the product images as references                          | [Nano Banana Pro](/models/image/nano-banana-pro)          |
| `product` | roasOS places the product cut-out into a described scene, and holds the shape and the label of the product | [Bria Product Shot](/models/image-edit/bria-product-shot) |

Use `scene` when the frame is an illustration of an idea: a person, a room, a mood, a table of props. Use `product` when the product must survive the render without one pixel of drift.

<Callout>
  The `product` lane needs `POST /v1/image-edit/bria-product-shot`. That endpoint is an API capability first. While the agent's generation surface does not admit it, the `product` lane falls back to Nano Banana Pro with the cut-out as a reference image, and the run says which model it used. Call the endpoint directly to get the placement model itself.
</Callout>

## What the run reads

| Input          | Where it comes from                | What it gives                                                                                                       |
| -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| The product    | `product_id`                       | three shots of the [product kit](/concepts/product-kits) on the `scene` lane, and the cut-out on the `product` lane |
| The brand      | your [brand kit](/brand/brand-kit) | the logo as a reference image, the colours as hex values, the two font names, and `cta_text`                        |
| A person       | `avatar_id`                        | a gallery avatar or a workspace avatar                                                                              |
| Your direction | `brief`                            | 400 characters at most                                                                                              |

`brief` is evidence, and never an instruction. roasOS reads it as a statement about the campaign. It does not follow text inside it as a command.

The brand-kit read and the product read cost **0 credits**. They carry no quote envelope, and they start no provider call.

<Callout type="warn">
  `avatar_id` names a roasOS gallery avatar or an avatar that your workspace already holds. To make an avatar over the API, use [`POST /v1/avatar/nano-banana-pro`](/models/avatar/nano-banana-pro) (MCP: `roasos_avatar_nano_banana_pro`), and then send its id. The legacy path `POST /v1/avatars` answers `503 avatar_generation_unavailable`.
</Callout>

## The type is rendered by the image model

The headline, the sub-head and the call to action are rendered **by the image model**, from the exact strings that the run puts in the prompt. roasOS passes your brand colours as hex values and your logo as a reference image.

<Callout type="warn">
  roasOS cannot guarantee your exact typeface on a static. A font slot in the brand kit holds a **name**, not a font file, and the image model draws the letters itself. The result is a similar face, and a glyph can come out wrong. A wrong glyph is a reason to render the variant again. It is not a refund.
</Callout>

This is the same limit that the [brand kit](/brand/brand-kit) states for a font name, at the point where the font reaches an image. roasOS has no deterministic text renderer today, so there is no path that composites your licensed font file onto the image.

Two things follow for your copy.

1. Keep the headline short. Short text has fewer glyphs to get wrong.
2. Read each variant before you publish it. Check the spelling of the brand name and the call to action.

## Rights

A statics run renders from four sources only: the product kit, your workspace uploads, your workspace avatars and the roasOS avatar gallery.

<Callout type="warn">
  A Discover creative is a competitor's ad. You read one to learn its structure and its style, and roasOS refuses one inside a statics run with `400 discover_source_not_allowed`. It never rides as source media, as a reference image or as a product image. Refer to [Media rights](/concepts/media-rights).
</Callout>

## Price

A statics run has no price of its own. Two meters run under it.

| What                    | Meter                                                                                                       |
| ----------------------- | ----------------------------------------------------------------------------------------------------------- |
| The thinking of the run | `max_credits`. roasOS charges the real tokens and refunds the rest.                                         |
| Each rendered image     | The price of the model on the catalog, quoted before dispatch and bounded by `generation_spend_cap_credits` |

The per-image prices come from the model pages, and no field of the statics door changes them.

| Render                              | Credits |
| ----------------------------------- | ------- |
| `scene` lane, one image at 1K or 2K | 5       |
| `scene` lane, one image at 4K       | 10      |
| `product` lane, one placement       | 1       |

A `product` variant that is finished with one edit pays for both steps. Send `quote_only: true` on the door to read the ceiling, and read the gate card for the price of the set. Refer to [Quotes and credits](/concepts/quotes-and-credits).

## Where the result lands

| Step                | Where you read it                |
| ------------------- | -------------------------------- |
| The run             | `GET /v1/agent-runs/{id}`        |
| The lifecycle       | `GET /v1/agent-runs/{id}/events` |
| Each rendered image | `GET /v1/jobs/{id}`              |

The images are ordinary jobs, so they appear in `GET /v1/jobs` beside every other render. Refer to [Jobs](/concepts/jobs).

## What roasOS does not do here

* roasOS writes no text layer onto the image after the render. The model draws the type.
* roasOS produces no export package and no ad-account upload. Download each image from its job result.
* roasOS makes one set for one product. It runs no split test and it tags no winner.

## Next

* Make a set: [Make static ads](/workflows/make-static-ads).
* Store your look first: [Brand kit](/brand/brand-kit).
* Build the product first: [Product kits](/concepts/product-kits).
